假设我有一个Django模型:
Post -表示博客帖子标记--代表规范标记。假装这是个标签。PostTag -在帖子和标签之间的外键中介。
现在假设我有5个贴有这些标签的帖子:
--
如果Post 1有5个标签,那么我如何才能得到N个具有最相似标签的帖子呢?
Posts.objects.filter(publish_at__gte=somedatetime).order_by("similarity")
发布于 2021-05-03 21:39:23
您可以使用与当前帖子匹配的标记的annotate()
来对每个Post
进行Count
。然后可以使用带注释的字段进行排序。
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
发布于 2021-05-03 20:40:41
解决方案之一可能是编写自定义ModelManager,它使用difflib.get_close_matches()
筛选其他帖子(您需要转换为字符串列表或类似的内容)。
或者可能是更简单的解决方案,但我不确定您是否会得到所需的;在Django中的"Q“对象中使用icontains
进行过滤,并将它们组合起来。
https://stackoverflow.com/questions/67375299
复制相似问题