使用多个字段使用计数注释Django查询集

时间:2015-12-11 02:23:22

标签: django django-models django-queryset django-aggregation

以下是我的模型的简化版本:

class Flight(models.Model):
    airline = models.CharField(max_length=100)
    origin = models.CharField(max_length=4)
    destination = models.CharField(max_length=4)

我想要做的是按照某些字段的公共值对Flight个对象进行分组,并使用相应的航班计数对这些组进行注释,如文档here中所述。

我只知道一个字段时就知道如何做到这一点。例如,使用

Flight.objects.values('airline').annotate(Count('id')).order_by('-id__count')

我得到这样的东西:

[{'airline': 'First Airlines', 'id__count': 21}, 
 {'airline': 'Air Second', 'id__count': 6},
 {'airline': 'Third Airways', 'id__count': 3}, ...]

这意味着有Flightairline字段为'First Airlines'的{​​{1}}个对象,依此类推。

但是,如何统计计算多个字段并组合成一个带注释的查询集,该查询集将来自不同字段的值视为同一个字段?

例如,假设我有3个从洛杉矶到纽约的航班和2个从另一个方向返回的航班(有3个Flight个对象,其来源'LAX'和目的地'JFK',以及2 Flight个来源'JFK'和目的地'LAX')。我怎么能得到这个:

[{'airport': 'LAX', 'id__count': 5}, 
 {'airport': 'JFK', 'id__count': 5}]

1 个答案:

答案 0 :(得分:0)

嗯,你不能在一个查询中做到这一点。你需要首先注明原点,然后是目的地,然后总结:

data1 = Flight.objects.values('origin').annotate(Count('id'))
data2 = Flight.objects.values('destination').annotate(Count('id'))
data = {}
for airport in { x for x in data1.keys() + data2.keys() }:
    data[airport] = data1.get(airport, 0) + data2.get(airport, 0)