Django通过在外键关系中使用来命令搜索结果

时间:2018-03-24 21:49:37

标签: django django-models

我想在搜索我的一个Django模型时,使用外键关系对搜索结果进行排序。 例: 型号"标签" - >多对多< - Model" Post"

如果我正在搜索标记,我希望按照它们在关系中使用的顺序返回查询匹配标记。这意味着最常用的标签符合搜索条件,等等。

这可能,如果可能,怎么样?

我有很大的问题要使我的应用程序适应所提出的方法,所以这里有一些代码用于澄清:

class Tag(models.Model):
    class Meta:
       ordering = #by number of relations to Post

class Post(models.Model):
    tags = models.ManyToManyField('Tag')

2 个答案:

答案 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)返回QuerySetTag个实例,其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')按照帖子计数设置顺序,按降序排列(这是-表示的内容)。