Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django objects.all().annotate和objects.annotate之间有什么区别?_Django_Python 3.x_Django Models - Fatal编程技术网

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

那个么,哪一个是最可取的方法&为什么?我扩展了答案-请检查。