2017-01-13 61 views
0

通過屬性組查詢集我有這樣的數據結構:如何在Django

class Currency(Model): 
    name = CharField() 
    ... 

class Invoice(Model): 
    currency = ForeignKey(Currency) 
    ... 

我想通過Currencies過濾所有Invoices將它們分組。我想結果是這樣的:

{ 
    'USD': '<INVOICES_QUERYSET_FOR_USD>', 
    'EUR': '<INVOICES_QUERYSET_FOR_EUR>', 
    ... 
} 

有沒有一種簡單的方法來實現這一點,或我必須自己裝字典?我知道Annotate給出了一個類似的結果,但我只是想通過共同的屬性值對Queryset進行分組。

+1

你想在Python或在你的模板? https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#regroup – allcaps

+0

在我的模板中會做。謝謝。 –

回答

1

像這樣的東西應該得到你想要的。

from collections import defaultdict 

currencies_of_interest = [ 'USD', 'EUR', ] 
qs = Invoice.objects.select_related(
    'currency' 
).filter(
    currency__name__in = currencies_of_interest 
)order_by('currency__name') 
currencies = defaultdict(list) 
for x in qs: 
    currencies[x.currency.name].append(x) 
# now currencies will look like: 
# { 
# 'USD': list[Invoice] for USD, 
# 'EUR': list[Invoice] for EUR, 
#  ... 
# } 

如果你喜歡用的查詢集工作,不介意做你的數據庫的多個查詢:

currencies_of_interest = [ 'USD', 'EUR', ] 
currencies = {} 
for x in currencies_of_interest: 
    currencies[x] = Invoice.objects.select_related(
     'currency').filter(currency__name=x) 
# now currencies will look like: 
# { 
# 'USD': QuerySet[Invoice] for USD, 
# 'EUR': QuerySet[Invoice] for EUR, 
#  ... 
# } 
+0

我以爲我不需要手動去做。我希望用一些命令獲得類似於'annotate'的輸出。謝謝。 –