2011-10-13 30 views
0

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

回答

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]来限制。
+0

并把它放在'Project'类的属性中。用'self'代替'current_project',当然。 –

+0

谢谢!工作几乎完美。一个小的重要事情,使其工作: '从django.db.models进口计数' – olegmil

相关问题