我需要在Django中构建一个查询,我觉得我在这里有点过头了,任何帮助都是令人遗憾的。我有内容和标签,它们之间有一个关系表:
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)上运行。我应该在数据库中添加哪些索引,以使其执行得体面?
发布于 2015-01-26 18:28:21
实际上,您可以通过聚合,在一个查询中很简单地做到这一点:
from django.db.models import Count
tags = (Tag.objects
.filter(content__title__icontains='matematica')
.values('name')
.annotate(tag_count=Count('tag')))
为了完成这项工作,您需要在ManyToMany
上添加一个Tag
声明,该声明使用现有的ContentTag
表。
content = models.ManyToManyField('Content', through='ContentTag')
因为通过表已经存在,这根本不会改变数据库。
https://stackoverflow.com/questions/28155717
复制相似问题