2012-10-30 16 views
32

我有松散的定义如下两种型号: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) 

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

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

其工作只是OK 此外,我想知道,在每一个项目中,有多少不同的“用户名”参与。 也就是说,计算组成一个项目的InformationUnits中有多少个不同的'用户名'。 我曾尝试以下,但它只是计数,而不管用户名InformationUnit的数量,:

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

注意,用户名是不是一个对象,它是一个字符串。有没有干净的方式来做到这一点,或者我应该创建一个更复杂的代码基于循环和意大利面代码:P

非常感谢!

回答

54

Count可以采取distinct的说法,就像这样:

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

这似乎并没有被记录,但你可以在源计数找到它。

+0

它的工作! 我发现这个地方甚至尝试过(实际上这是我在问这个问题之前做的最后一件事)。一开始它没有工作,但在重新启动开发服务器之后,今天又试了一次,它的确做到了:P非常感谢! – fenomenoxp

+0

这是记录(现在,无论如何):https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Count.distinct –

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

为工作,不应该的用户名必须是项目的一个领域? – fenomenoxp

+0

尝试过,但它失败,因为用户名不是项目的领域 – fenomenoxp

+0

可以证实这与django 1.7的作品 – rix

6

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

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

谢谢,这就是我正在寻找对于。接受的答案返回一个对象列表。你的解决方案为我工作。 – allardbrain