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 次方。我在 mysql 和 php 框架中使用 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中的复杂排序的主要内容,如果未能解决你的问题,请参考以下文章