是否可以計算Django ORM查詢中來自相關表的字段的表達式(例如:減法)的聚合(例如:減法)?Django查詢中表達式的聚合跨越多個表
有關我想要實現的完整示例,請參閱此工作SQL Fiddle。我把它分解成兩個問題(other one here)。在這種情況下,我具有表示在該序列中的「鏈接」的模型Sequence
表示數字的序列,以及一個模型Part
:
Sequence Sequence Sequence Sequence ...
0 5 20 15 ...
|-- Part --|-- Part --|-- Part --|-- ...
每個Part
從而代表了增量,這是差在序列中的兩個值之間。我有一組(非連續的)部分,並且想要計算那些三角洲的總和。這樣的事情:
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;
我不知道如何使用Django ORM來做到這一點。我可以做一個單一的值:
Part.objects.filter(condition).aggregate(Sum('before__value')).values()
但不適用於涉及多個值的表達式。使用F()
is not supported yet,所以我正在尋找一種替代方法。我也看了this question,這也是關於彙總中的表達式,但the accepted answer(使用extra
)不適用於我的情況AFAIK,因爲我感興趣的字段不在同一個表中,而是在相關表中。
>>> Part.objects.filter(condition).extra(select={
... 'delta':'sum(after__value - before__value)'
... })
DatabaseError: no such column: after__value
這裏有一個SSCCE,萬一有人想用它的實驗:Download或Browse。它與上面鏈接的SQL fiddle具有相同的型號和數據。