在Django中通过计算自定义排序

时间:2011-04-12 11:44:06

标签: django sorting

Django中自定义计算排序的任何解决方案?我想创建一个显示我博客中热门帖子的视图。排名将根据Post的属性计算。我只想说我有3个IntegerFields,叫做x,y和z,排名计算将是x * y / z。

有什么想法吗?我想做Top Post,以及按时间过滤的其他变体,例如过去24小时,7天,1个月等。

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用extra检索额外的计算列并按其排序:

MyModel.objects.filter(post_date__lt=#date#)
       .extra(select={'custom_order': "x*y/z"}).order_by('custom_order')

这种方法的问题在于您正在编写sql,因此它并不总是可以跨数据库移植(尽管,对于您提供的示例,这个问题可以避免,因为它是一个简单的计算)

否则,您可以使用纯python进行排序:

sorted_models = sorted(MyModel.objects.filter(post_date__lt=#date#)
                , key=lambda my_model:my_model.x*my_model.y/my_model.z))

答案 1 :(得分:0)

extra()queryset方法应该允许你这样做。见the docs

答案 2 :(得分:-1)

由于你不能通过django中的方法和属性来命令查询集,你必须在python中进行排序。

考虑将您的计算字段转换为模型上的property,然后您可以在视图中执行此操作:

sorted_posts = sorted(Post.objects.all(), key=lambda post: post.calculated_field )

最后,您可以将sorted_posts传递给您的列表模板。