python - Django 查询,平均计数不同

标签 python django postgresql django-models django-queryset

我有一个 Donation 模型定义为:

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

每个用户都可以多次捐赠给任何项目,因此在 db 中我可以拥有以下内容:

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

这给了我一个可以在 python 中使用的不同 project/user 对列表。

我想知道是否有query-only 方式来做到这一点?

我的设置:

  • Django 1.8
  • PostgreSQL

最佳答案

您不需要对平均值求和,只需计算不同的值并除以不同用户的数量即可。此外,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

编辑:让它成为一个查询集

我想你可以通过一个查询来实现这一点,但我现在无法检查:

from django.db.models import Count, Avg

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

参见:aggregating annotations in 1.8

关于python - Django 查询,平均计数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022273/

相关文章:

python - 将数据帧拆分为分组 block

python - 如何训练以行号为特征的 spaCy 模型?

python - 如何使用 scipy.optimize 中的 curve_fit 和跨多个数据集的共享拟合参数?

sql - Postgresql 8.4 - 限制窗口函数范围

postgresql - 在我的 mac 上进行 postgresql 本地开发时遇到问题

python - 将遥测数据添加到视频 [python]

python - 当 child 不能继承时如何创建基类?

python - 同一页面上的重复占位符

python - 决定何时使用 Python Social Auth 刷新 OAUTH2 token

ruby-on-rails - pg_dump : "could not connect to server" in Rails "schema_format = :sql" migration