目前,我正在练习注释,并对以下代码有一些困惑。
>>> 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()‘有什么不同呢?
如何在没有all()的情况下在图书对象上执行annotate()提供所有图书对象。
我已经阅读了Django文档,但找不到任何答案。
谢谢。
发布于 2020-04-02 15:17:17
没有区别,因为all实际上是在模型管理器上调用get_queryset来返回查询集。您可以查看BaseManager的implementation来查看。
使用all()更可取,因为它保证返回一个QuerySet实例,您可以进一步迭代/过滤/等,而使用管理器返回Manager实例,您可以过滤/注释/任何东西,但不能以与queryset相同的方式使用。
示例:
for book in Book.objects:
# this will fail
for book in Book.objects.all():
# this will workhttps://stackoverflow.com/questions/60985750
复制相似问题