Django ORMクエリの関連テーブルからフィールドの式(例:減算)の集計(例:合計)を計算することは可能ですか?
私が達成しようとしていることの完全な例については、この動作するSQLFiddleを参照してください。私はそれを2つの質問に分けました(他の1つはここにあります)。この場合、Sequence
数列を表すモデルとPart
、この数列の「リンク」を表すモデルがあります。
Sequence Sequence Sequence Sequence ...
0 5 20 15 ...
|-- Part --|-- Part --|-- Part --|-- ...
したがって、それぞれがデルタPart
を表します。これは、シーケンス内の2つの値の差です。(連続していない)パーツのセットがあり、それらのデルタの合計を計算したいと思います。このようなもの:
sum([p.after.value - p.before.value for p in Part.objects.filter(...)])
しかし、単一のクエリでは(理由は、これをより複雑なクエリのサブクエリとして使用したいためです)。SQLでそれを行うのは簡単です:
select sum(a.value - b.value)
from part p
join sequence a on p.after_id = a.id
join sequence b on p.before_id = b.id
where condition
group by p.other_field;
DjangoORMを使用してそれを行う方法がわかりません。私は単一の値でそれを行うことができます:
Part.objects.filter(condition).aggregate(Sum('before__value')).values()
ただし、複数の値を含む式の場合はそうではありません。使用F()
はまだサポートされていないので、別の方法を探しています。集合体の式に関するこの質問も調べましたが、関心のあるフィールドが同じテーブルではなく関連するテーブルにあるため、受け入れられた回答(を使用extra
)は私のケースAFAIKには適用されません。 。
>>> Part.objects.filter(condition).extra(select={
... 'delta':'sum(after__value - before__value)'
... })
DatabaseError: no such column: after__value
誰かがそれを実験したい場合に備えて、これがSSCCEです:ダウンロードまたは参照。上記でリンクされているSQLフィドルと同じモデルとデータがあります。