1

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フィドルと同じモデルとデータがあります。

4

1 に答える 1

0

1.8で式のサポートがFaggregate実装されたので、答えは簡単になりました。

Part.objects.filter(condition).aggregate(sum=Sum(F('after__value')-F('before__value'))).values()
于 2015-06-16T08:29:40.463 に答える