如何向Django QuerySet添加其他列

时间:2014-08-14 13:08:47

标签: python sql django django-models

我有一个带书籍的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(),但它似乎不适合这种东西。

2 个答案:

答案 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,您可以使用提到的annotateBook.objects.annotate(score=Sum('votes__value'))对它们求和。

如果有更多可能的值,您可以通过在上述查询中添加.filter(votes__value__range=(1,1))来过滤注释。

如果它更复杂,则必须将extraselect一起使用。