2013-03-16 62 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具有相同的型号和数据。

回答