BooksのQuerySetがあり、score
フィールドをすべてのBook結果に追加したいと思います。
_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はnot唯一の方法です。 Value()
式を使用できます(docs here を参照):
from Django.db.models import CharField, Value
MyModel.objects.all().annotate(mycolumn=Value('xxx', output_field=CharField()))