我有一个带书籍的QuerySet,我想在每个书籍结果中添加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()
,但它似乎不适合这种东西。
答案 0 :(得分:27)
原始SQL 不是唯一的方法。您可以使用Value()
表达式(请参阅文档here):
from django.db.models import CharField, Value
MyModel.objects.all().annotate(mycolumn=Value('xxx', output_field=CharField()))
答案 1 :(得分:5)
如果投票可能的值只有1和-1,您可以使用提到的annotate:Book.objects.annotate(score=Sum('votes__value'))
对它们求和。
如果有更多可能的值,您可以通过在上述查询中添加.filter(votes__value__range=(1,1))
来过滤注释。
如果它更复杂,则必须将extra
与select
一起使用。