我的应用程序中有Project
和Tag
个模型,它们之间存在多对多关系。在每个项目的页面上,我想列出3个与其共同标记最多的其他项目。我该如何执行此查询?
class Tag(models.Model):
name = models.CharField(max_length=300)
class Project(models.Model):
name = models.CharField(max_length=300)
...
tags = models.ManyToManyField(Tag)
答案 0 :(得分:4)
可以将它们全部打包成一行:
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]
。