【问题标题】:Different queryset, same result不同的查询集,相同的结果
【发布时间】:2021-10-27 01:24:32
【问题描述】:

我目前正在学习模型管理器和自定义查询集。在试图理解它的实现时,我不知何故只是不明白这两个调用之间的区别。我喜欢包括 all() 因为它更容易理解。不过我想知道有什么不同。

1. Post.objects.all().filter(status=1).order_by('-updated')
2. Post.objects.filter(status=1).order_by('-updated')

>>> from django.contrib.auth.models import User
>>> from blog.models import Post
>>> user= User.objects.filter(username='chair').first()
>>> Post.objects.filter(author= user)
<PostQuerySet [<Post: 111 updateeee>, <Post: 22222>, <Post: draftdraft>]>
>>> Post.objects.all().filter(author= user)
<PostQuerySet [<Post: 111 updateeee>, <Post: 22222>, <Post: draftdraft>]>

【问题讨论】:

    标签: python python-3.x django django-models django-queryset


    【解决方案1】:

    它们是一样的。您可以检查将完成的生成的 SQL 查询,看看它们实际上是相同的。

    >>> from django.contrib.auth.models import User
    >>> qs_1 = User.objects.all().filter(username="Me").order_by('-id')
    >>> qs_2 = User.objects.filter(username="Me").order_by('-id')
    >>> print(qs_1.query)
    SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" = Me ORDER BY "auth_user"."id" DESC
    >>> print(qs_2.query)
    SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" = Me ORDER BY "auth_user"."id" DESC 
    

    由于您涉及管理器和查询集的主题,请注意documented

    请注意,delete() 是唯一未公开的 QuerySet 方法 经理本身。这是一种安全机制,可防止您 意外请求Entry.objects.delete(),并删除所有 条目。如果您确实想删除所有对象,那么您必须 显式请求完整的查询集:Entry.objects.all().delete()

    因此可以安全地假设除delete() 之外的所有QuerySet 功能,例如all()filter()get()等都可以直接找经理Model.objects.&lt;method&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多