按匹配数量排序Django查询结果

0 投票
1 回答
757 浏览
提问于 2025-04-18 15:38

在我的Django应用中,我有一些Blog(博客)和BlogPosts(博客文章)。

它们的模型大致是这样的:

class Blog(models.Model):
    name = models.CharField(Entry)
    details = models.TextField()
    ...

class BlogPost(models.Model):
    blog = models.ForeignKey(Blog)
    title = models.CharField()
    ...

给定一个博客名称的列表,我想返回所有至少出现在一个给定博客中的BlogPost

我已经找到了使用Q对象来实现这个功能的方法。我创建了这样的查询:

# Return blogs that appear in either nameOfBlog1 or nameOfBlog2
q1 = Q(blog__name = nameOfBlog1)
q2 = Q(blog__name = nameOfBlog2)
Blog.objects.filter(q1 | q2)

这个方法是有效的。

不过,我希望结果能够按照匹配到的Blog数量来排序。也就是说,出现在我搜索的所有Blog中的BlogPost应该排在最前面,而只出现在一个Blog中的BlogPost应该排在最后。

在Django中有没有办法做到这一点呢?

1 个回答

1

试试这个:

BlogPost.objects.filter(q1 | q2).annotate(blog_times=Count('id')).order_by('blog_times')

撰写回答