如何在Django查询中添加附加列

2024-04-25 03:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个图书查询集,我想在每个图书结果中添加一个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(),但似乎不是针对这种东西。


Tags: andfromidobjectsvaluecountallwhere
2条回答

如果可能的投票值只有1和-1,您可以使用前面提到的annotateBook.objects.annotate(score=Sum('votes__value'))对它们求和。

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

如果它更复杂,你就必须用extraselect一起使用。

原始SQL是而不是的唯一方法。可以使用Value()表达式(请参见文档here):

from django.db.models import CharField, Value

MyModel.objects.all().annotate(mycolumn=Value('xxx', output_field=CharField()))

相关问题 更多 >