Django objects.all().annotate和objects.annotate之间有什么区别?
目前我正在练习注释,对下面的代码有些困惑Django objects.all().annotate和objects.annotate之间有什么区别?,django,python-3.x,django-models,Django,Python 3.x,Django Models,目前我正在练习注释,对下面的代码有些困惑 >>> 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] &
>>> 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'
>b=Book.objects.all().annotate(upper_name=upper('name'))
>>>b[0]。名称
“第一册”
>>>b[0]。上\u名称
“第一册”
>>>ba=Book.objects.annotate(upper_name=upper('name'))
>>>ba[0]
>>>ba[0]。名称
“第一册”
>>>ba[0]。上_名称
“第一册”
当我不使用all()
时,我得到了相同的输出,那么使用Book.objects.all()
和“Book.objects.annotate()”有什么区别呢
如何在没有all()
的情况下对图书对象执行annotate()
提供所有图书对象
我已经阅读了Django文档,但没有找到任何答案
谢谢。没有区别,因为
all
实际上在模型管理器上调用get\u queryset
返回queryset。您可以查看BaseManager
的
使用all()
更可取,因为它保证返回一个实例,您可以进一步迭代/filter/etc,其中使用manager返回一个实例,您可以对该实例进行筛选/注释/whatever,但不能以与queryset相同的方式使用
例如:
for book in Book.objects:
# this will fail
for book in Book.objects.all():
# this will work
那个么,哪一个是最可取的方法&为什么?我扩展了答案-请检查。