2013-03-16 63 views
1

是否可以計算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,萬一有人想用它的實驗:DownloadBrowse。它與上面鏈接的SQL fiddle具有相同的型號和數據。

回答