#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>