是否可以计算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具有相同的型号和数据。