0

Вот упрощенная версия моей модели:Аннотирование Django querysets с отсчетами с помощью нескольких полеев

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

ответ

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)