Django将字段值注释为queryset

rix*_*rix 1 django django-orm

我想将字段值(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()感觉不对。

jnn*_*nns 5

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

  1. 使用Django的双下划线联接语法:
    如果你只是想用一个相关对象的字段作为条件在您的SQL查询您可以参考该领域field相关的对象上related_objectrelated_object__field。所有可能的查找类型在Django文档的“ 字段查找”下列出

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

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

    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文档非常简单。您应该再次调查。