如何根据Django中的标签获得类似的项目
问题描述:
我在我的应用程序中有Project
和Tag
模型,它们之间有多对多的关系。在每个项目的页面上,我想列出3个与其共有最多标签的项目。我怎样才能执行这个查询?如何根据Django中的标签获得类似的项目
class Tag(models.Model):
name = models.CharField(max_length=300)
class Project(models.Model):
name = models.CharField(max_length=300)
...
tags = models.ManyToManyField(Tag)
答
它可以打包这一切在同一行:
Project.objects.filter(tags__in=current_project.tags.all()).annotate(Count('name')).order_by('-name__count')[:3]
或者,在步骤分解:
tags = current_project.tags.all()
matches = Project.objects.filter(tags__in=tags).annotate(Count('name'))
results = matches.order_by('-name__count')[:3]
逻辑去如下:
-
current_project
是您想要的项目的实例与...的关系。 -
filter
选择标签与当前项目相同的所有项目。 -
annotate
向返回值添加一个变量来计算类似名称的数量。由于与多个标签匹配的项目会多次返回,因此此值表示匹配数量。 - 结果按已注释
name__count
变量排序。要获得排名前3的结果,列表使用[:3]
来限制。
并把它放在'Project'类的属性中。用'self'代替'current_project',当然。 –
谢谢!工作几乎完美。一个小的重要事情,使其工作: '从django.db.models进口计数' – olegmil