85

次のように大まかに定義された 2 つのモデルがあります。

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')

これは問題なく動作します。

さらに、各プロジェクトで、いくつusernameの が参加しているかを知りたいです。つまり、1 つのプロジェクトを構成する のusername中にいくつの異なる があるかを数えます。私は次のことを試しましたが、 に関係なく、InformationUnit単に の数を数えます:InformationUnitusername

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

usernameはオブジェクトではなく、文字列であることに注意してください。これを行うためのきれいな方法はありますか、それともループとスパゲッティコードに基づいてより複雑なコードを作成する必要があります:P

どうもありがとう!

4

4 に答える 4

178

Countdistinct次のように、引数を取ることができます。

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 に答える