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()))