Django中自定义计算排序的任何解决方案?我想创建一个显示我博客中热门帖子的视图。排名将根据Post的属性计算。我只想说我有3个IntegerFields,叫做x,y和z,排名计算将是x * y / z。
有什么想法吗?我想做Top Post,以及按时间过滤的其他变体,例如过去24小时,7天,1个月等。
谢谢!
答案 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
传递给您的列表模板。