我有一个 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'))
关于python - Django 查询,平均计数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022273/