Другой набор запросов, тот же результат
В настоящее время я изучаю 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>
.