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

#python #python-3.x #django #django-models #django-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>]>

 

Ответ №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 
 

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

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

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