Django:计算与查询匹配的内容的标签

时间:2015-01-26 17:46:55

标签: python django postgresql django-models

我需要在Django中构建一个查询,我觉得我在这里有点过头了,任何帮助都是ppreciated。 我有内容和标签,它们之间有关系表:

class Content(mixins.TracketEntity):
    publisher = models.ForeignKey(User)
    title = models.CharField(max_length=256, null=False, blank=False)
    data = jsonfield.JSONField()

class Tag(mixins.TracketEntity):
    publisher = models.ForeignKey(User)
    name = models.CharField(max_length=256, null=False, blank=False)

class ContentTag(models.Model):
    content = models.ForeignKey(Content)
    tag = models.ForeignKey(Tag)

现在,我可以按标题过滤内容,例如:

content_query = Content.objects.filter(title__icontains="matematica")

这将给出一个内容列表,比如说:

  • Matematica basica
  • Matematica pura
  • Matematica aplicada
  • Matematica avancada

并说这些内容有这些标签:

  • Matematica basica。标签= MATEMATICA,EASY
  • Matematica pura。标签= MATEMATICA
  • Matematica aplicada。标签= MATEMATICA,HARD
  • Matematica avancada。标签= MATEMATICA,HARD

鉴于这种情况,我如何构建一个Django查询,该查询将返回与content_query的内容相关联的标签列表,以及每个内容的内容数量? 该查询的预期结果集为:

  • MATEMATICA,4
  • EASY,1
  • HARD,2

此外,这种查询将一直在数据库(Postgres)上运行。 我应该在数据库上添加哪些索引以使其表现得体面?

2 个答案:

答案 0 :(得分:1)

实际上,您可以通过聚合在单个查询中完成此操作。

from django.db.models import Count
tags = Tag.objects.filter(content__title__icontains='matematica').values('name').annotate(tag_count=Count('tag'))

为了使这项工作,您需要在Tag上添加一个ManyToMany声明,该声明使用现有的直通表,ContentTag:

content = models.ManyToManyField('Content', through='ContentTag')

因为直通表已经存在,所以根本不会改变你的数据库。

答案 1 :(得分:0)

获取与标题包含" matematica"

Content个实例相关的所有标记
tags = Content.objects.filter(title__icontains="matematica").tags.all()

然后,计算标签。

result_dict = {}
for tag in tags:
    result_dict[tag.name] +=1