web-dev-qa-db-ja.com

Django QuerySetに列を追加する方法

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()を試しましたが、この種のものではないようです。

11
dev9

投票可能な値が1と-1のみの場合、言及した annotateBook.objects.annotate(score=Sum('votes__value'))を使用してそれらを合計できます。

可能な値がさらにある場合は、上記のクエリに.filter(votes__value__range=(1,1))を追加することで注釈をフィルタリングできます。

より複雑な場合は、extraselectを使用する必要があります。

5
ambi

生のSQLはnot唯一の方法です。 Value()式を使用できます(docs here を参照):

from Django.db.models import CharField, Value

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