我有一个图书查询集,我想在每个图书结果中添加一个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,您可以使用前面提到的annotate:
Book.objects.annotate(score=Sum('votes__value'))
对它们求和。如果有更多可能的值,可以通过向上面的查询添加
.filter(votes__value__range=(1,1))
来过滤注释。如果它更复杂,你就必须用
extra
和select
一起使用。原始SQL是而不是的唯一方法。可以使用
Value()
表达式(请参见文档here):相关问题 更多 >
编程相关推荐