Агрегирование и группировка Django: проблема чистоты кода - PullRequest
2 голосов
/ 26 июля 2010

Вот небольшая проблема, с которой я столкнулся.


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 Ответ

4 голосов
/ 26 июля 2010

из Django docs :

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

Я не уверен на 100%, что это будет работать (сейчас 2:20 утра), но я надеюсь, что так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...