【问题标题】:Annotating Django querysets with counts using multiple fields使用多个字段使用计数注释 Django 查询集
【发布时间】:2016-03-16 20:53:16
【问题描述】:

这是我的模型的简化版本:

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}, ...]

这意味着有 21 个Flight 对象,其airline 字段为'First Airlines',依此类推。

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

例如,假设我有 3 个从洛杉矶到纽约的航班,另外有 2 个回程航班(有 3 个 Flight 对象的起点 'LAX' 和目的地 'JFK',以及 2 个 Flight 对象始发地'JFK' 和目的地'LAX')。我怎样才能得到这个:

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

【问题讨论】:

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


    【解决方案1】:

    嗯,你不能在一个查询中完成。你需要先注释起源,然后是目的地,然后总结:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2021-10-17
      • 2012-08-03
      相关资源
      最近更新 更多