如何在Django中基于标签获得类似的项目

时间:2011-10-13 06:30:24

标签: python django django-orm

我的应用程序中有ProjectTag个模型,它们之间存在多对多关系。在每个项目的页面上,我想列出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)

1 个答案:

答案 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]

逻辑如下:

  1. current_project是您想要关系的项目的实例。
  2. filter选择所有具有与当前项目相同的标记的项目。
  3. annotate向返回值添加一个变量,用于计算相似名称的数量。由于多次返回匹配多个标签的项目,因此该值表示匹配数。
  4. 结果按注释的name__count变量排序。要获得前3个结果,列表的上限为[:3]