有没有办法使用计数而不是长度来计算排序的查询集?

Posted

技术标签:

【中文标题】有没有办法使用计数而不是长度来计算排序的查询集?【英文标题】:Is there a way to count the sorted queryset using count instead of length? 【发布时间】:2020-10-31 23:43:41 【问题描述】:

我正在研究我项目的搜索部分。在我的一个过滤器上,我必须使用 sorted() 函数。代码:-

posts = Post.objects.filter(title__icontains=query)
posts = sorted(posts, key=lambda obj: obj.titleFilter())

但是,在项目的其他过滤器中,我不必使用 sorted,因为它可以使用 django annotate 等来完成。所以,在模板中我通常必须做posts.count,除了标题过滤器。

我的模板,代码:-

<div> posts.count  results found.</div>

我知道,我可以使用模板中的 if 案例来工作并应用 length 函数,例如:

<div>
    % if title_filter %
         posts|length 
    % else %
         posts.count 
    % endif % results found.
</div>

另外,我不确定长度是否合适,因为有些文章不使用 length 进行查询集。

谢谢!!!欢迎随时提问。

【问题讨论】:

sorted 不再是 QuerySet。这就是为什么如果您可以通过.order_by() 订购通常会更好的原因之一。 但是,order_by 无法做到这一点,所以我不得不使用 sorted。 好吧,因为它不是一个查询集,因此它不再有count。这里的posts 是一个列表,而不是QuerySet 那么,如果我在模板中使用length会不会有问题。它会在计数之间产生差异吗?现在,顺便说一句,它没有任何区别。 不,没有区别。但是使用 QuerySet 通常会更好,因为它是惰性的,并且可以轻松地与额外的调用链接。 【参考方案1】:

排序后的帖子不再是 QuerySet。 你可以这样做

posts = Post.objects.filter(title__icontains=query)
count = posts.count()
posts = sorted(posts, key=lambda obj: obj.titleFilter())

将计数作为变量发送

【讨论】:

是的,我能做到。但是,根据@Willem,长度并没有什么不同。我会坚持上一个。但是,谢谢。

以上是关于有没有办法使用计数而不是长度来计算排序的查询集?的主要内容,如果未能解决你的问题,请参考以下文章

如何以正确的顺序链接查询集,而不是按日期排序,按foreignKey排序?

带有额外选择的 Django 查询集计数

dictsort 没有结果

核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?

有没有办法用月份数字而不是月份名称来搜索 SQL 查询?

查找与排序:计数排序