Django中的复杂排序

Posted

技术标签:

【中文标题】Django中的复杂排序【英文标题】:Complex ordering in Django 【发布时间】:2010-12-30 04:20:22 【问题描述】:

所以我正在提取链接列表,并尝试按受欢迎程度对这些链接进行排序。我正在使用 Hacker News 算法:

Y Combinator 的黑客新闻: 人气 = (p - 1) / (t + 2)^1.5 选票除以年龄因素。 在哪里 p :来自用户的投票(积分)。 t :自提交以来的时间,以小时为单位。 p 减 1 以否定提交者的投票。 年龄因子是(以小时为单位的提交时间加 2)的 1.5 次方。因子是(以小时为单位的提交时间加 2)的 1.5 次方。

我在 mysqlphp 框架中使用 order by 完成了这项工作

(SUM(votes.karma_delta) - 1) / POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC

现在我正在使用 PostgreSQL 和 Django。我知道这个确切的 SQL 可能行不通,但我可以稍后进行转换。我遇到的问题是我不知道如何在 Django 中获得如此复杂的 order_by。我的观点有一个完美的:

popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta'))

如果我不需要的话,我真的不想通过使用原始 sql 来解决这个问题。

总结一下我的问题:如何在 Django 中创建复杂的 order_by?

编辑

会有分页,我真的只想对我拉的条目进行排序。在 Python 中实际进行排序会更好吗?

【问题讨论】:

【参考方案1】:

没有干净的方法,但在您的自定义 SQL 中使用 extra():

popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta'))
popular_links = popular_links.extra(
    select = 'popularity': '(karma_total - 1) / POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5)',,
    order_by = ['-popularity',]
)

【讨论】:

似乎应该有一个 wy 用 F 表达式来做到这一点? 这给我一个例外:Caught an exception while rendering: column "karma_total" does not exist LINE 1: SELECT ((karma_total - 1)) AS "popularity", "links_link"."id... 尝试跳过注释然后在选择中执行 SUM,或者检查查询的样子 - 我不确定注释/聚合与额外的配合效果如何。【参考方案2】:

如果您仍然要提取整个列表(例如,您不只提取前 10 个条目),那么您可以在 Python 中进行排序。

【讨论】:

我应该注意到我有分页计划。

以上是关于Django中的复杂排序的主要内容,如果未能解决你的问题,请参考以下文章

Django:使用嵌套模型进行查询的复杂排序

如何在 Django 中按计算字段复杂排序?

Django:使用嵌套模型从许多关系查询中进行复杂排序和过滤

url查询中的Django自定义排序

django 按非相关表中的汇总值排序

Django模板按“不相关”模型的字段排序