Другой набор запросов, тот же результат

В настоящее время я изучаю Model Manager и Custom Queryset. Пытаясь разобраться в его реализации, я как-то не понимаю, в чем разница между этими двумя вызовами. Мне нравится включать 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 

Поскольку вы находитесь в теме менеджеров и кверисетов, обратите внимание, что как документировано:

Обратите внимание, что delete() - это единственный метод QuerySet, который не раскрывается на менеджера. Это механизм безопасности, чтобы предотвратить случайного запроса Entry.objects.delete(), и удаления всех записи. Если вы хотите удалить все объекты, то вам необходимо явно запросить полный набор запросов: Entry.objects.all().delete()

Поэтому можно предположить, что все функциональные возможности QuerySet, кроме delete(), например, all(), filter(), get() и т.д., доступны непосредственно из менеджера Model.objects.<method>.

Вернуться на верх