сумма Джанго для набора запросов - PullRequest
0 голосов
/ 25 апреля 2011

Мне нужно выполнить агрегацию в наборе запросов django для наборов данных.

У меня есть модель, которая выглядит примерно так:

class Model1(models.Model):
    ... some fields here ...

class Model2(models.Model):
    model1 = models.ForeignKey(Model1)
    number = models.IntegerField()
    active = models.BooleanField()
    category = models.CharField(choices=...)

Они отлично работают, на случай, если в этом демонстрационном коде пропущена опечатка Теперь я хочу отобразить model1s с соответствующими им model2s, сгруппированными по категориям. Я делаю это, используя тег шаблона перегруппировки (обратите внимание, у меня есть метод класса model2s, который возвращает все то же самое, что и model2_set.filter (active = True)):

{% regroup m1.model2s by category as m2_list %}

Затем я отображаю их как обычно с перегруппировкой. Этот материал также отлично работает. Теперь мне нужно добавить итоговую сводку в начало каждой группы категорий с суммой чисел для этой группы. Поэтому, если у меня было 2 модели2 из той же категории, ссылающиеся на 1 Модель1, и у одной из них было число = 1, а у другой - число = 2, то мне нужно отобразить 3.

На самом деле будет много Model2, поэтому это может быть дорогостоящим запросом.

Я посмотрел на документы и вижу совокупность и аннотации, но ни один из них, похоже, не позволил мне сделать сумму, основанную на категории. Я не хотел бы делать это для каждой категории:

m2sum = m1.model2s.filter(category='something').aggregate(Sum('number'))['number__sum']

Есть ли более чистый способ сделать это, надеюсь, один из них хорошо работает с regroup?

1 Ответ

3 голосов
/ 25 апреля 2011

Я уверен, что вы можете сделать это с помощью метода аннотации QuerySet.Я выложу обновление, если смогу найти хороший пример.

Обновление: я думаю, что-то вроде этого .... если я правильно понимаю ваш вопрос.За исключением того, что вы бы использовали Count вместо Avg.

Author.objects.values ​​('name'). Annotate (average_rating = Avg ('book__rating')) http://docs.djangoproject.com/en/dev/topics/db/aggregation/#values

...