85

我有两个松散定义的模型,如下所示:

class InformationUnit(models.Model):
    username = models.CharField(max_length=255)
    project = models.ForeignKey('Project')
    ...

class Project(models.Model):
    name = models.CharField(max_length=255)

现在,在一个视图中,我想注释InformationUnit属于一个项目的所有 s,所以我这样做:

p = Project.objects.all().annotate(Count('informationunit')

效果很好。

此外,我想知道,在每个项目中,有多少不同username的人参与。也就是说,计算组成一个项目username的 s 中有多少不同的 s。InformationUnit我尝试了以下方法,但它只是计算 的数量InformationUnit,而不管username

p = Project.objects.all().annotate(Count('informationunit__username')

请注意,username它不是一个对象,它是一个字符串。有没有一种干净的方法可以做到这一点,或者我应该基于循环和意大利面条代码创建一个更复杂的代码:P

非常感谢!

4

4 回答 4

178

Count可以接受一个distinct论点,如下所示:

p = Project.objects.all().annotate(Count('informationunit__username', 
                                         distinct=True))

这似乎没有记录,但您可以在 Count 的源代码中找到它。

于 2012-10-30T18:26:11.363 回答
36

如果您只想计算不同的值,可以使用 distinct() 和 count() 函数:

count = Project.objects.values('informationunit__username').distinct().count()
于 2015-09-18T13:56:22.273 回答
14
Project.objects.all().annotate(Count('informationunit__username', 
                                     distinct=True))
于 2012-10-30T18:24:30.413 回答
6

SQLSELECT field1, COUNT(DISTINCT(pk)) FROM project GROUP BY field1 ORDER BY NULL;

查询集

Project.objects.all().values(field1).annotate(count=Count('pk', distinct=True)).order_by()
于 2019-03-18T07:08:15.940 回答