我想将字段值(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()感觉不对。
答案 0 :(得分:3)
在查询集中至少有三种访问相关对象的方法。
使用Django的双下划线连接语法:
如果您只想将相关对象的字段用作SQL查询中的条件,则可以使用field
引用相关对象related_object
上的字段related_object__field
。所有可能的查找类型都列在Field lookups下的Django文档中。
Book.objects.filter(related_object__field=True)
使用带F()
的注释:
您可以通过引用带有F()对象的字段来填充查询集中的带注释字段。 F()
表示模型或注释字段的字段。
Book.objects.annotate(added_field=F("related_object__field"))
访问对象属性: 评估查询集后,可以通过该对象上的属性访问相关对象。
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()非常简单。你应该再次研究一下。
答案 1 :(得分:0)
默认情况下您有<somerelation>_id
“。例如comment.user_id
。它有效,因为User
有很多Comments
。但是,如果Book
有很多Authors
,那么author_id
应该是什么情况呢?