Django 将字段值注释为查询集

标签 django django-orm

我想将字段值 (id) 附加到如下所示的 QS,但 Django 抛出“str”对象没有属性“查找”错误。

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

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

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

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

最佳答案

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

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

    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()很简单。你应该(再次)调查一下。

关于Django 将字段值注释为查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31642425/

相关文章:

python - Django教程最大深度递归

django - 调试 django-channels

django - Django ManyToMany 字段的 set() 操作是否清除现有关系?

python - 如何获得原始订单中的字段?

javascript - 数据表不显示 Django

django - 通过使用查询集传递请求来测试 login_view

python - 在 Django 中获取多对多关系中的第一个项目

python - Django ORM 查询限制特定键实例

django - 如何从 Django 中找到 Postgres 版本?

python - Django 数组字段。如何通过 django admin 保存嵌套的时间数组?