Запрос Django, среднее число отличное

У меня есть Donation модель, определенная как:

Donation
    project = models.ForeignKey(Project)
    user = models.CharField()

Каждый пользователь может пожертвовать несколько раз на любой проект, поэтому в БД я могу иметь следующее:

 Donation
-------------------
 project | user
-------------------
 1       |  A
 2       |  A
 3       |  A
 1       |  B
 2       |  B
 2       |  C

Теперь мне нужно вычислить среднее значение отдельного проекта для пользователя, в этом случае это будет:

A: 3
B: 2
C: 1
=> ( 3 + 2 + 1 ) / 3 = 2

Пока у меня есть следующее:

distinct_pairs = Donation.objects.order_by('project')
         .values('user', 'project')
         .distinct()

Это дает мне список отличительных особенностей project /user пары, с которыми я могу работать в Python.

Я хотел бы знать, есть ли способ query-only сделать это?

Моя настройка:

  • Django 1.8
  • PostgreSQL
4 голоса | спросил nobe4 18 PM00000060000000931 2016, 18:36:09

1 ответ


0

Вам не нужно суммировать значения для среднего, вы можете просто посчитать разные значения и поделить на количество разных пользователей. Кроме того, order_by является избыточным, поскольку нам нужны только подсчеты.

distinct_pairs_count = Donation.objects.values('user', 'project').distinct().count()

distinct_users_count = Donation.objects.values('user').distinct().count()

average = distinct_pairs_count / float(distinct_users_count)  # in Python 2
average = distinct_pairs_count / distinct_users_count         # in Python 3

РЕДАКТИРОВАТЬ: сделайте один QuerySet

Я думаю, что вы можете достичь этого одним запросом, но я не могу проверить это сейчас:

from django.db.models import Count, Avg

average = Donation.objects.values('user', 'project')
             .annotate(num_projects=Count('project', distinct=True))
             .aggregate(Avg('num_projects'))

См .: агрегирование аннотаций в 1.8

ответил akarilimano 18 PM00000070000001731 2016, 19:01:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132