我想在搜索我的一个Django模型时,使用外键关系对搜索结果进行排序。 例: 型号"标签" - >多对多< - Model" Post"
如果我正在搜索标记,我希望按照它们在关系中使用的顺序返回查询匹配标记。这意味着最常用的标签符合搜索条件,等等。
这可能,如果可能,怎么样?
我有很大的问题要使我的应用程序适应所提出的方法,所以这里有一些代码用于澄清:
class Tag(models.Model):
class Meta:
ordering = #by number of relations to Post
class Post(models.Model):
tags = models.ManyToManyField('Tag')
答案 0 :(得分:1)
要按最常用的标记排序,您可能应该使用类似
的内容from django.db.models import Count
queryset = matching_tags.annotate(used_count=Count('posts'))
queryset = queryset.order_by('-used_count')
答案 1 :(得分:1)
以下是基于Alexandr的更完整的答案:
为了答案,我假设您的Tag
模型有一个name
字段可供搜索。
from django.db.models import Count
search_term = 'this is the string you search for'
query = Tag.objects.filter(name__contains=search_term).annotate(post_count=Count('post')).order_by('-post_count')
更详细:
Tag.objects.filter(name__contains=search_term)
返回QuerySet
个Tag
个实例,其name
包含变量search_term
中定义的表达式(我们假设这来自用户,想要搜索的用户)对于标签)。
.annotate(post_count=Count('post')
向实例添加一个额外字段,其中包含该特定实例与Posts
的关系数。您可以通过以下方式在代码中引用此内容:
for tag in query:
print('This tag is used for', tag.post_count, 'posts')
最后,.order_by('-post_count')
按照帖子计数设置顺序,按降序排列(这是-
表示的内容)。