【问题标题】:How to get similar projects based on tags in Django如何根据Django中的标签获取相似项目
【发布时间】:2011-10-13 06:30:24
【问题描述】:

我的应用程序中有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)

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    可以将所有内容打包在一行中:

    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] 封顶。

    【讨论】:

    • 并将其放入Project 类的属性中。将current_project 替换为self,当然。
    • 谢谢!!工作几乎完美。让它发挥作用的一件小事:from django.db.models import Count
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多