Python Django查询,平均计数不同

Python Django查询,平均计数不同,python,django,postgresql,django-models,django-queryset,Python,Django,Postgresql,Django Models,Django Queryset,我的捐赠模式定义为: Donation project = models.ForeignKey(Project) user = models.CharField() 每个用户都可以为任何项目贡献多次时间,因此在db中,我可以拥有以下内容: Donation ------------------- project | user ------------------- 1 | A 2 | A 3 | A 1 | B

我的捐赠模式定义为:

Donation
    project = models.ForeignKey(Project)
    user = models.CharField()
每个用户都可以为任何项目贡献多次时间,因此在db中,我可以拥有以下内容:

 Donation
-------------------
 project | user
-------------------
 1       |  A
 2       |  A
 3       |  A
 1       |  B
 2       |  B
 2       |  C
distinct_pairs = Donation.objects.order_by('project')
         .values('user', 'project')
         .distinct()
现在,我需要计算每个用户不同项目的平均值,在这种情况下,它将是:

A: 3
B: 2
C: 1
=> ( 3 + 2 + 1 ) / 3 = 2
到目前为止,我掌握的情况如下:

 Donation
-------------------
 project | user
-------------------
 1       |  A
 2       |  A
 3       |  A
 1       |  B
 2       |  B
 2       |  C
distinct_pairs = Donation.objects.order_by('project')
         .values('user', 'project')
         .distinct()
这给了我一个distincts
project
/
user
对的列表,我可以在python中使用它们

我想知道是否只有
查询
方法可以做到这一点

我的设置:

  • Django 1.8
  • PostgreSQL

    • 不需要求和平均值,只需计算不同的值并除以不同的用户数即可。另外,
      order\u 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'))
      

      请参阅:

      我不确定这是否有效。考虑5个用户为同一个项目捐赠一次的情况。code>distinct\u pairs\u count将是5,而
      distinct\u projects\u count
      将是1,平均值将是5,而不是1…@nobe4是的,对不起,我的意思是除以用户数,而不是除以项目数。我已经更新了我的答案。这是一个很好的解决方法,我将使用它直到我只能找到一个查询(如果存在),谢谢。@nobe4我认为这可以通过聚合和注释来完成。检查我的编辑。似乎很有希望,它得到了正确的整数(即,除法得到
      1.13
      )。只是想知道-为什么要将用户设置为用户模型的字符字段而不是外键?Char字段作为用户听起来不是最佳实践,因为它不是“真正的”用户,主要是为了简化示例。