不同的查询集,相同的结果

Different queryset, same result

我目前正在学习模型管理器和自定义查询集。在试图理解它的实现时,我不知何故只是不明白这两个调用之间的区别。我喜欢包括 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>]>

他们是一样的。您可以检查将要完成的结果 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:

Note that delete() is the only QuerySet method that is not exposed on a Manager itself. This is a safety mechanism to prevent you from accidentally requesting Entry.objects.delete(), and deleting all the entries. If you do want to delete all the objects, then you have to explicitly request a complete query set: Entry.objects.all().delete()

因此可以安全地假设除 delete() 之外的所有 QuerySet 功能,例如all()filter()get() 等可直接从经理处获得 Model.objects.<method>