2010-07-25 117 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