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" 
Вернуться на верх