首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:计数匹配查询的内容标记

Django:计数匹配查询的内容标记
EN

Stack Overflow用户
提问于 2015-01-26 17:46:55
回答 1查看 184关注 0票数 2

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

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
content_query = Content.objects.filter(title__icontains="matematica")

这将列出一份内容清单,例如:

  • [医]马蒂藻
  • [医]紫癜
  • [医]文心莲
  • 阿文卡达

说这些内容有这样的标签:

  • 马特曼蒂亚·巴西卡标签= MATEMATICA,容易
  • [医]紫癜。标签= MATEMATICA
  • [医]马特曼蒂卡( Matematica )标记= MATEMATICA,硬的
  • 马特曼蒂卡·阿凡卡达标记= MATEMATICA,硬的

在这种情况下,如何构建Django查询,返回与content_query内容相关的标记列表以及每个查询的内容计数?该查询的预期结果集为:

  • MATEMATICA,4
  • 轻松,1
  • 硬,2

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 18:28:21

实际上,您可以通过聚合,在一个查询中很简单地做到这一点:

代码语言:javascript
运行
复制
from django.db.models import Count
tags = (Tag.objects
        .filter(content__title__icontains='matematica')
        .values('name')
        .annotate(tag_count=Count('tag')))

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

代码语言:javascript
运行
复制
content = models.ManyToManyField('Content', through='ContentTag')

因为通过表已经存在,这根本不会改变数据库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28155717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档