Очень часто я вижу конструкции вроде
MyModel.objects.all().filter(...)
который вернет QuerySet для Mananger по умолчанию. Вначале all()
кажется довольно избыточным, потому что
MyMode.objects.filter(...)
дает тот же результат.
Однако это похоже на сохранение только для Менеджера по умолчанию из-за следующих двух утверждений в документации Django:
Выдержка из главы "Добавление дополнительных методов менеджера"
Метод Custom Manager может возвращать все, что вы хотите. Он не имеет для возврата QuerySet.
Определение метода менеджера all()
:
все() Возвращает копию текущего QuerySet (или подкласса QuerySet). Это может быть полезно в ситуациях, когда вы, возможно, захотите пройти либо диспетчером модели, либо QuerySet, и выполните дальнейшую фильтрацию на результат. После вызова all() на любом объекте, у вас обязательно будет QuerySet для работы с.
Это похоже на противоречие со мной. С одной стороны, Django предлагает свободу, позволяющую методу менеджера возвращать все, что угодно, а с другой - для QuerySet для метода all()
. Я знаю, что каждый менеджер имеет метод get_queryset
, который вызывается all()
. Но кто останавливает меня от переопределения all()
в моем пользовательском менеджере? Хотя я согласен, что это будет плохой дизайн.
-
Итак, насколько я вижу, метод
all()
не гарантирует возврат QuerySet. Что именно возвращаетMyModel.objects
? Вызывает ли этот операторall()
? или `get_queryset()? -
Вы предпочитаете
MyModel.objects.filter(...)
илиMyModel.objects.all().filter(...)
. И если да, то почему? -
Вы когда-нибудь сталкивались с неуклюжими менеджерами, которые могли бы бесполезно использовать эти методы?