首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objects.all().annotate和objects.annotate有什么区别?

objects.all().annotate和objects.annotate有什么区别?
EN

Stack Overflow用户
提问于 2020-04-02 14:51:55
回答 1查看 47关注 0票数 1

目前,我正在练习注释,并对以下代码有一些困惑。

代码语言:javascript
复制
>>> 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文档,但找不到任何答案。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-02 15:17:17

没有区别,因为all实际上是在模型管理器上调用get_queryset来返回查询集。您可以查看BaseManagerimplementation来查看。

使用all()更可取,因为它保证返回一个QuerySet实例,您可以进一步迭代/过滤/等,而使用管理器返回Manager实例,您可以过滤/注释/任何东西,但不能以与queryset相同的方式使用。

示例:

代码语言:javascript
复制
for book in Book.objects:
    # this will fail

for book in Book.objects.all():
    # this will work
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60985750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档