我有两个松散地定义的模型:
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
非常感谢!
答案 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()