Счетчик комментариев 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
Спасибо большое!
Ответы
Ответ 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()