Django将字段值注释到queryset
我想将字段值(id)附加到下面这样的QS,但Django抛出的“str”对象没有属性“lookup”错误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
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不知道如何处理
而且,这个问题相当直截了当。你应该(再)调查一下