2015-12-11 41 views
0

這裏是我的模型的簡化版本:詮釋Django的查詢集使用多個字段計數

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)