sql – Django中的复杂排序

前端之家收集整理的这篇文章主要介绍了sql – Django中的复杂排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我拉了一个链接列表,我试图按人气排序这些链接.我正在使用黑客新闻算法:
Y Combinator's Hacker News:
Popularity = (p - 1) / (t + 2)^1.5

Votes divided by age factor.
Where

p : votes (points) from users.
t : time since submission in hours.

p is subtracted by 1 to negate submitter's vote.
Age factor is (time since submission in hours plus two) to the power of 1.5.factor is (time since submission in hours plus two) to the power of 1.5.

我通过使用order by在MysqLPHP Framework中完成了这个

(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中实际进行排序是否更好?

解决方法

没有干净的方法,但使用自定义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,1.5)',},order_by = ['-popularity',]
)

猜你在找的MsSQL相关文章