Django Querysets:按相似标记的数量排序帖子

2024-05-16 11:28:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个Django模型:

Post-表示博客帖子 标记-表示规范标记。让我们假装它是一个标签。 PostTag-Post和标记之间的外键中介

现在让我们假设我有5篇贴子带有这些标签:

  1. #食物#故事#点心#园艺#主菜

  2. #食物#故事#馅饼#火腿#三明治

  3. #食物#故事#花#鱼#寿司

  4. #食物#故事#电脑#键盘#鼠标

  5. #食物#咖啡#维生素#罗勒#柑橘

--

给定带有5个标签的帖子1,我如何才能得到N个标签最相似的帖子

Posts.objects.filter(publish_at__gte=somedatetime).order_by("similarity")

Tags: django标记模型规范标签post帖子外键
2条回答

您可以^{}每个Post使用其与当前帖子匹配的^{}标记。然后,可以使用带注释的字段进行排序

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个最相似的帖子感兴趣的话)

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

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

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

或者更简单的解决方案,但我不确定你会得到你需要的;使用Django中“Q”对象中的icontains进行过滤,并将它们组合起来

相关问题 更多 >