代码之家  ›  专栏  ›  技术社区  ›  sebpiq

Django聚合和分组:代码清洁度问题

  •  2
  • sebpiq  · 技术社区  · 16 年前

    这是我遇到的一个小问题。


    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())
            )
    

    谢谢你的帮助!!!!

    1 回复  |  直到 16 年前
        1
  •  4
  •   joozek    16 年前

    从 Django docs :

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

    我不能百分之百地肯定它会起作用(现在是凌晨2:20),但我希望如此。