首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django Queryset:按相似标签的数量排序帖子

Django Queryset:按相似标签的数量排序帖子
EN

Stack Overflow用户
提问于 2021-05-03 20:18:38
回答 2查看 182关注 0票数 1

假设我有一个Django模型:

Post -表示博客帖子标记--代表规范标记。假装这是个标签。PostTag -在帖子和标签之间的外键中介。

现在假设我有5个贴有这些标签的帖子:

  1. #食品#故事#前台#园艺#主菜

  1. #食品#故事#前台#火腿#三明治

  1. #食品#故事#鲜花#鱼#寿司

  1. #食品#故事#电脑#键盘#鼠标

  1. #食品#咖啡#维生素#罗勒#柑橘

--

如果Post 1有5个标签,那么我如何才能得到N个具有最相似标签的帖子呢?

代码语言:javascript
运行
复制
Posts.objects.filter(publish_at__gte=somedatetime).order_by("similarity")
EN

回答 2

Stack Overflow用户

发布于 2021-05-03 21:39:23

您可以使用与当前帖子匹配的标记的annotate()来对每个Post进行Count。然后可以使用带注释的字段进行排序。

代码语言:javascript
运行
复制
from django.db.models import Count, Q

post = Post.objects.first()

similar_posts = Post.objects.filter().annotate(
    similar_tags=Count('tags', filter=Q(tags__in=post.tags.all()))
).order_by('-similar_tags')[:5]

添加一个片[:5]将一个LIMIT 5添加到查询中(如果我们只对5个最相似的帖子感兴趣)。

此示例基于一个简单的模型定义:

代码语言:javascript
运行
复制
class Post(models.Model):
    tags = models.ManyToManyField('PostTag')


class PostTag(models.Model):
    name = models.CharField(max_length=255, unique=True)

    def __str__(self):
        return self.name
票数 2
EN

Stack Overflow用户

发布于 2021-05-03 20:40:41

解决方案之一可能是编写自定义ModelManager,它使用difflib.get_close_matches()筛选其他帖子(您需要转换为字符串列表或类似的内容)。

或者可能是更简单的解决方案,但我不确定您是否会得到所需的;在Django中的"Q“对象中使用icontains进行过滤,并将它们组合起来。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67375299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档