1. ホーム
  2. python

[解決済み] Django は、distinct フィールドで count をアノテートします。

2023-05-08 10:40:47

質問

私は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 が参加しているのかを知りたいのです。 つまり、何人の異なる username の中にある InformationUnit があり、それが1つのプロジェクトを構成しています。 を試しましたが、これは単に InformationUnit に関係なく、単に username :

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

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

どうもありがとうございます。

どのように解決するのですか?

Count を取ることができます。 distinct のような引数を取ることができます。

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

これは文書化されていないようですが、Countのソースに記載されています。