Django - Подсчет отношений "многие-ко-многим
В моей модели есть много Вещей, которые могут иметь много Ярлыков, и эта связь осуществляется с помощью Описаний, отправленных пользователем через форму. Я не могу понять, как подсчитать количество каждой метки у каждой вещи.
В файле models.py у меня есть:
class Label(models.Model):
name = models.CharField(max_length=100)
class Thing:
name = models.CharField(max_length=100)
class Description:
thingname = models.ForeignKey(Thing, on_delete=models.CASCADE)
labels = models.ManyToManyField(Label,blank=True)
Если мы говорим, что наша текущая Вещь - это кошка, и десять человек представили Описание для кошки, как мы можем заставить наш шаблон выводить суммарное количество каждой связанной Метки для Вещи?
Например: Кошка
- 10 пушистый
- 6 пушистый
- 4 милый
- 2 опасный
- 1 громкий
Я пробовал несколько вещей с фильтрами и аннотациями, например
counts = Label.objects.filter(description_form = pk).annotate(num_notes=Count('name'))
но я думаю, что есть что-то очевидное, что я упускаю либо в моем views.py, либо в моем шаблоне.
Вы можете использовать это, чтобы получить эту информацию:
Description.objects.prefetch_related("labels").values("labels__name", "thing_name__name").annotate(num_notes=models.Count("labels__name"))
это будет равно:
SELECT "core_label"."name",
"core_thing"."name",
Count("core_label"."name") AS "num_notes"
FROM "core_description"
LEFT OUTER JOIN "core_description_labels"
ON ( "core_description"."id" =
"core_description_labels"."description_id" )
LEFT OUTER JOIN "core_label"
ON ( "core_description_labels"."label_id" =
"core_label"."id" )
INNER JOIN "core_thing"
ON ( "core_description"."thing_name_id" = "core_thing"."id" )
GROUP BY "core_label"."name",
"core_thing"."name"