我想将字段值(id)附加到如下所示的QS,但是Django抛出“ str”对象没有属性“ lookup”错误。
Book.objects.all().annotate(some_id='somerelation__id')
Run Code Online (Sandbox Code Playgroud)
看来我可以使用Sum()获得我的id值
Book.objects.all().annotate(something=Sum('somerelation__id'))
Run Code Online (Sandbox Code Playgroud)
我想知道没有办法简单地将原始字段值注释为QS吗?在这种情况下使用sum()感觉不对。
至少有三种访问查询集中相关对象的方法。
使用Django的双下划线联接语法:
如果你只是想用一个相关对象的字段作为条件在您的SQL查询您可以参考该领域field相关的对象上related_object有related_object__field。所有可能的查找类型在Django文档的“ 字段查找”下列出。
Book.objects.filter(related_object__field=True)
Run Code Online (Sandbox Code Playgroud)使用带注释的F():
您可以通过使用F()对象引用字段来填充查询集中的带注释的字段。F()表示模型的字段或带注释的字段。
Book.objects.annotate(added_field=F("related_object__field"))
Run Code Online (Sandbox Code Playgroud)访问对象属性:评估查询集后,您可以通过该对象上的属性访问相关对象。
book = Book.objects.get(pk=1)
author = book.author.name # just one author, or…
authors = book.author_set.values("name") # several authors
Run Code Online (Sandbox Code Playgroud)
除非您使用select_related(),否则这将触发附加查询。
我的建议是采用解决方案2,因为您已经走了一半,我认为它会为您提供所要的东西。您现在面临的问题是您没有指定查找类型,而是传递了字符串(somerelation_id)Django不知道该怎么做。
另外,有关annotate()的Django文档非常简单。您应该再次调查。
| 归档时间: |
|
| 查看次数: |
4393 次 |
| 最近记录: |