Django -计算多对多关系

e5nszbig  于 2023-01-21  发布在  Go
关注(0)|答案(1)|浏览(108)

在我的模型中,我有很多可以有很多标签的东西,这种关系是由用户通过表单提交的描述建立的,我不知道如何计算每个东西有多少标签。
在www.example.com中,我有:models.py, I have:

class Label(models.Model):
    name = models.CharField(max_length=100)

class Thing(models.Model):
    name = models.CharField(max_length=100)

class Description(models.Model):
    thingname = models.ForeignKey(Thing, on_delete=models.CASCADE)
    labels = models.ManyToManyField(Label,blank=True)

如果我们说我们当前的东西是一只猫,并且有十个人提交了猫的描述,那么我们如何让我们的模板输出这个东西的每个相关标签的总数呢?
例如:猫

  • 10蓬松
  • 6模糊
  • 4可爱
  • 2危险
  • 1声

我已经尝试了一些过滤器和注解,例如
计数=标签.对象.过滤器(描述_表单= pk).注解(编号_注解=计数("名称"))
但我觉得我的www.example.com或模板中明显缺少一些东西。views.py or in my template.

wydwbb8l

wydwbb8l1#

您可以使用此命令检索以下信息:

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"

相关问题