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

我的捐赠模型定义为:

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中使用它.

我想知道是否有查询方法来做到这一点?

我的设置:

> 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

编辑:使它成为一个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'))

见:aggregating annotations in 1.8

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...