2010-07-25 89 views
2

這是我遇到的一個小問題。Django聚合和分組:代碼清潔問題


3個非常簡單的模型:

>>> class Instrument(models.Model): 
...  name = models.CharField(max_length=100) 
... 
>>> class Musician(models.Model): 
...  instrument = models.ForeignKey(Instrument) 
... 
>>> class Song(models.Model): 
...  author = models.ForeignKey(Musician) 

我想計數的歌曲數量,由儀器名稱和作者分組


我必須把它的解決方案,但我想知道在純django-orm中編寫它的最佳方式是什麼,例如代碼將是乾淨,簡潔和可重用的(我指的是可以使用的東西輕鬆重複使用以按不同屬性分組)。什麼其實我想看到的是,如果一些代碼,我已經寫了一般性地解決這個問題是非常有用的,或者如果我只是錯過了一些東西大...

這裏的第一個解決方案,我認爲:

results = [] 
for instrument_name in Instrument.objects.values_list('instrument', flat=True): 
    for musician in Musician.objects.filter(instrument__name=instrument_name): 
     results.append((
      instrument_name, 
      musician, 
      Song.objects.filter(author=musician).count()) 
     ) 

謝謝你的幫助!

+0

爲什麼是-1?我違反了規則嗎? – sebpiq 2010-07-25 22:58:57

+1

我沒有給你-1,但我建議把它寫成「我試圖做X,但不知道如何 - 你能幫忙嗎?」而不是作爲一系列規則的挑戰。你在尋求幫助,而不是進行代碼競爭。 – 2010-07-25 23:22:00

+0

當然......但另一方面,我知道我的問題的答案!我真正想知道的是,用純粹的django-orm解決這個問題的最好方法是什麼......也許我應該寫這個! – sebpiq 2010-07-25 23:27:35

回答

4

Django docs

from django.db.models import Count 
Song.objects.values('author','author__instrument').annotate(Count("id")) 

我不是100%肯定它會工作(這是上午02點20),但我希望如此。

+0

它的確,Django中聚合的關鍵是在聚合之前使用.values,Django使用它來構建「group by」子句 – 2010-07-26 08:20:55