Django使用不同的字段注释计数

时间:2012-10-30 18:17:04

标签: python django

我有两个松散地定义的模型:

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,所以我这样做:

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

哪个工作正常 此外,我想知道,在每个项目中,有多少不同的“用户名”参与其中。 也就是说,计算组成一个项目的InformationUnits中有多少个不同的“用户名”。 我尝试了以下方法,但它只计算InformationUnit的数量,无论用户名是什么:

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

请注意,username不是对象,而是字符串。是否有一种干净的方法可以做到这一点,还是应该根据循环和意大利面条代码创建更复杂的代码:P

非常感谢!

4 个答案:

答案 0 :(得分:85)

Count可以采用distinct参数,如下所示:

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

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

答案 1 :(得分:12)

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

count = Project.objects.values('informationunit__username').distinct().count()

答案 2 :(得分:8)

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

答案 3 :(得分:1)

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

QuerySet

Project.objects.all().values(field1).annotate(count=Count('pk', distinct=True)).order_by()