Python 如何向Django QuerySet添加附加列
我有一个图书查询集,我想在每个图书结果中添加一个Python 如何向Django QuerySet添加附加列,python,sql,django,django-models,Python,Sql,Django,Django Models,我有一个图书查询集,我想在每个图书结果中添加一个score字段 qs = Book.objects.all() 我将用原始SQL编写: SELECT *, ( (SELECT COUNT(*) FROM votes WHERE value=1 AND book=b.id) - (SELECT COUNT(*) FROM votes WHERE value=-1 AND book=b.id) ) AS score FROM Boo
score
字段
qs = Book.objects.all()
我将用原始SQL编写:
SELECT
*,
(
(SELECT COUNT(*) FROM votes WHERE value=1 AND book=b.id) -
(SELECT COUNT(*) FROM votes WHERE value=-1 AND book=b.id)
) AS score
FROM
Book b;
我如何在Django实现它?我尝试了
annotate()
,但它似乎不适合这种类型的东西。如果投票可能的值只有1和-1,你可以使用前面提到的:Book.objects.annotate(score=sum('voates\u value'))
如果有更多可能的值,您可以通过向上述查询添加.filter(投票数\uuu值\uu范围=(1,1))
来过滤注释
如果它更复杂,您将不得不使用extra
和select
原始SQL不是唯一的方法。您可以使用Value()
表达式(参见文档):
使用或
extra
和select
(在这里提问之前要更仔细地使用谷歌)。看看谷歌上没有一个页面描述我想要什么。我已经阅读了文档中有关annotate
和extra
的所有内容。它一句话也没说。如果您找到了任何有用的内容,请共享一个链接。@ambi如何筛选此处的帮助?谢谢。如何添加另一个不能与Sum
、Avg
和类似内容一起使用的列?如果我们想添加一些格式化文本或布尔列,该怎么办<代码>注释(mycolumn='xxx')不起作用。您应该在此处使用extra
和select
,如前所述:因此,原始SQL是唯一的方法:(感谢您的帮助真棒,我正在查找此错误:您需要导入的输出字段没有定义全局名称“IntegerField”。
from django.db.models import CharField, Value
MyModel.objects.all().annotate(mycolumn=Value('xxx', output_field=CharField()))