我需要在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")
这将给出一个内容列表,比如说:
并说这些内容有这些标签:
鉴于这种情况,我如何构建一个Django查询,该查询将返回与content_query的内容相关联的标签列表,以及每个内容的内容数量? 该查询的预期结果集为:
此外,这种查询将一直在数据库(Postgres)上运行。 我应该在数据库上添加哪些索引以使其表现得体面?
答案 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