В чем разница между objects.all (). Annotate и objects.annotate? - PullRequest
1 голос
/ 02 апреля 2020

В настоящее время я практикуюсь для аннотирования и имею некоторую путаницу в отношении приведенного ниже кода.

>>> b = Book.objects.all().annotate(upper_name = Upper('name'))
>>> b[0].name
'Book1'
>>> b[0].upper_name
'BOOK1'
>>> ba = Book.objects.annotate(upper_name = Upper('name'))
>>> ba[0]
<Book: Book1>
>>> ba[0].name
'Book1'
>>> ba[0].upper_name
'BOOK1'

Я получаю такой же вывод, когда не использую all(), так в чем разница между использованием Book.objects.all() и 'Book. objects.annotate () '.

Как annotate() на объектах Book без all() предоставляет все объекты Book.

Я прочитал Django документацию, но не смог найти ответ .

Спасибо.

1 Ответ

1 голос
/ 02 апреля 2020

Нет никакой разницы, потому что all на самом деле вызывает get_queryset в менеджере моделей для возврата набора запросов. Вы можете проверить реализацию из BaseManager, чтобы увидеть это.

Использование all() предпочтительнее, потому что гарантированно вернет экземпляр QuerySet , который вы можете выполнить в дальнейшем. / filter / et c, где при использовании менеджера возвращается Диспетчер экземпляра, который вы можете фильтровать / аннотировать / как угодно, но не можете использовать так же, как и набор запросов.

Пример:

for book in Book.objects:
    # this will fail

for book in Book.objects.all():
    # this will work
...