【问题标题】:Django annotate a field value to querysetDjango 将字段值注释到查询集
【发布时间】:2015-07-26 22:07:55
【问题描述】:

我想将字段值 (id) 附加到如下所示的 QS,但 Django 抛出一个 'str' object has no attribute 'lookup' 错误。

Book.objects.all().annotate(some_id='somerelation__id')

看来我可以使用 Sum() 获取我的 id 值

Book.objects.all().annotate(something=Sum('somerelation__id'))

我想知道没有办法简单地将原始字段值注释到 QS 吗?在这种情况下使用 sum() 感觉不对。

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    至少有三种方法可以访问查询集中的相关对象。

    1. 使用 Django 的双下划线连接语法:
      如果您只想在 SQL 查询中使用相关对象的字段作为条件,您可以使用 related_object__field 引用相关对象 related_object 上的字段 field。所有可能的查找类型都列在Field lookups 下的 Django 文档中。

      Book.objects.filter(related_object__field=True)
      
    2. 使用带有F()的注释:
      您可以通过使用 F() 对象引用字段来填充查询集中的注释字段。 F() 表示模型的字段或带注释的字段。

      Book.objects.annotate(added_field=F("related_object__field"))
      
    3. 访问对象属性: 评估查询集后,您可以通过该对象上的属性访问相关对象。

      book = Book.objects.get(pk=1)
      author = book.author.name  # just one author, or…
      authors = book.author_set.values("name")  # several authors 
      

      除非您使用select_related(),否则这会触发额外的查询。

    我的建议是使用解决方案 #2,因为您已经完成了一半,我认为它可以满足您的需求。您现在面临的问题是您没有指定查找类型,而是传递了一个字符串 (somerelation_id) Django 不知道如何处理。

    此外,Django documentation on annotate() 非常简单。您应该(再次)调查一下。

    【讨论】:

      【解决方案2】:

      你有<somerelation>_id“默认”。例如comment.user_id。它之所以有效是因为User 有很多Comments。但是如果Book 有很多Authors,那么在这种情况下author_id 应该是什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-29
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2021-05-09
        • 2020-06-13
        • 1970-01-01
        相关资源
        最近更新 更多