Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:计算与查询匹配的内容标记_Python_Django_Postgresql_Django Models - Fatal编程技术网

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

Python Django:计算与查询匹配的内容标记,python,django,postgresql,django-models,Python,Django,Postgresql,Django Models,我需要在Django中构建一个查询,我觉得我在这里有点不知所措,任何帮助都是非常感谢的。 我有内容和标签,它们之间有一个关系表: class Content(mixins.TracketEntity): publisher = models.ForeignKey(User) title = models.CharField(max_length=256, null=False, blank=False) data = jsonfield.JSONField() clas

我需要在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")
这将给出一个目录,比如:

  • 马蹄莲
  • 马蹄莲
  • 无叶Matematica aplicada
  • 阿旺卡马蒂卡酒店
并说这些内容有这些标签:

  • 马蹄莲。标签=MATEMATICA,简单
  • 马蹄莲。标记=MATEMATICA
  • 马蹄莲。标签=MATEMATICA,硬
  • 马蹄莲。标签=MATEMATICA,硬
在这种情况下,我如何构建一个Django查询,该查询将返回与content_查询内容相关联的标记列表,以及每个标记的内容计数? 该查询的预期结果集为:

  • 马特马蒂卡,4
  • 轻松,1
  • 硬的,2
而且,这种查询将一直在数据库(Postgres)上运行。
我应该在数据库上添加哪些索引以使其正常运行?

获取与标题包含“matematica”的
内容
实例相关的所有标记

然后,数一数标签

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

实际上,您只需通过聚合在单个查询中即可完成此操作:

from django.db.models import Count
tags = (Tag.objects
        .filter(content__title__icontains='matematica')
        .values('name')
        .annotate(tag_count=Count('tag')))
为了实现这一点,您需要在
标记
上添加一个
manytomy
声明,该声明使用现有的直通表
ContentTag

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

因为through表已经存在,这根本不会改变您的数据库。

我更新了我的答案。非常感谢。你刚刚救了我们一天,先生:-)
content = models.ManyToManyField('Content', through='ContentTag')