Django将字段值注释到queryset

Django将字段值注释到queryset,django,django-orm,Django,Django Orm,我想将字段值(id)附加到下面这样的QS,但Django抛出的“str”对象没有属性“lookup”错误 Book.objects.all().annotate(some_id='somerelation__id') 似乎我可以使用Sum()获得id值 我想知道有没有一种方法可以简单地将原始字段值注释到QS?在这种情况下使用sum()感觉不正确。默认情况下,您有\u id。例如comment.user\u id。它之所以有效,是因为用户有许多注释。但是如果书有许多作者,那么在这种情况下作者id

我想将字段值(id)附加到下面这样的QS,但Django抛出的“str”对象没有属性“lookup”错误

Book.objects.all().annotate(some_id='somerelation__id')
似乎我可以使用Sum()获得id值


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

默认情况下,您有
\u id
。例如
comment.user\u id
。它之所以有效,是因为
用户
有许多
注释
。但是如果
有许多
作者
,那么在这种情况下
作者id
应该是什么?

默认情况下,您有
\u id
。例如
comment.user\u id
。它之所以有效,是因为
用户
有许多
注释
。但是如果
Book
有许多
作者,那么在这种情况下
作者id应该是什么?

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

  • 使用Django的双下划线连接语法:
    如果您只想在SQL查询中使用相关对象的字段作为条件,可以使用
    相关对象字段
    引用相关对象
    相关对象
    上的字段
    字段
    。Django文档中列出了所有可能的查找类型

  • 使用带注释的
    F()

    通过使用对象引用字段,可以在查询集中填充带注释的字段
    F()
    表示模型的字段或带注释的字段

    Book.objects.annotate(added_field=F("related_object__field"))
    
  • 访问对象属性: 计算queryset后,可以通过该对象上的属性访问相关对象

    book = Book.objects.get(pk=1)
    author = book.author.name  # just one author, or…
    authors = book.author_set.values("name")  # several authors 
    
    这会触发一个额外的查询,除非您正在使用

  • 我的建议是采用解决方案2,因为你已经走到了这条路的一半,我认为它会完全满足你的要求。您现在面临的问题是,您没有指定查找类型,而是传递了一个字符串(
    somerelationshid
    ),Django不知道如何处理


    而且,这个问题相当直截了当。您应该(再次)研究这一点。

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

  • 使用Django的双下划线连接语法:
    如果您只想在SQL查询中使用相关对象的字段作为条件,可以使用
    相关对象字段
    引用相关对象
    相关对象
    上的字段
    字段
    。Django文档中列出了所有可能的查找类型

  • 使用带注释的
    F()

    通过使用对象引用字段,可以在查询集中填充带注释的字段
    F()
    表示模型的字段或带注释的字段

    Book.objects.annotate(added_field=F("related_object__field"))
    
  • 访问对象属性: 计算queryset后,可以通过该对象上的属性访问相关对象

    book = Book.objects.get(pk=1)
    author = book.author.name  # just one author, or…
    authors = book.author_set.values("name")  # several authors 
    
    这会触发一个额外的查询,除非您正在使用

  • 我的建议是采用解决方案2,因为你已经走到了这条路的一半,我认为它会完全满足你的要求。您现在面临的问题是,您没有指定查找类型,而是传递了一个字符串(
    somerelationshid
    ),Django不知道如何处理

    而且,这个问题相当直截了当。你应该(再)调查一下