Django将字段值注释为queryset

时间:2015-07-26 22:07:56

标签: django django-orm

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

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

似乎我可以使用Sum()

获取我的id值
Book.objects.all().annotate(something=Sum('somerelation__id'))

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

2 个答案:

答案 0 :(得分:3)

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

  1. 使用Django的双下划线连接语法:
    如果您只想将相关对象的字段用作SQL查询中的条件,则可以使用field引用相关对象related_object上的字段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()

  4. ,否则会触发其他查询

    我的建议是采用解决方案#2,因为你已经走到了这条路的一半,我认为它会给你你正在要求的东西。你现在面临的问题是你没有指定查找类型,而是你传递一个字符串(somerelation_id)Django不知道该怎么做。

    此外,Django documentation on annotate()非常简单。你应该再次研究一下。

答案 1 :(得分:0)

默认情况下您有<somerelation>_id“。例如comment.user_id。它有效,因为User有很多Comments。但是,如果Book有很多Authors,那么author_id应该是什么情况呢?