Подтвердить что ты не робот

Счетчик комментариев 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')

который работает нормально Кроме того, я хочу знать, в каждом проекте, сколько разных "имени пользователя". То есть, подсчитайте, сколько различных "имени пользователя" есть в InformationUnits, которые составляют один проект. Я пробовал следующее, но он просто подсчитывает количество InformationUnit, независимо от имени пользователя:

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

Обратите внимание, что имя пользователя не является объектом, это строка. Есть ли чистый способ сделать это или я должен создать более сложный код на основе циклов и кода спагетти: P

Спасибо большое!

4b9b3361

Ответ 1

Count может принимать аргумент distinct, например:

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

Это не похоже на документацию, но вы можете найти его в источнике для Count.

Ответ 2

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

Ответ 3

Если вы хотите просто подсчитать отдельные значения, вы можете использовать функции distinct() и count():

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