Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中的自定义计算排序_Django_Sorting - Fatal编程技术网

Django中的自定义计算排序

Django中的自定义计算排序,django,sorting,Django,Sorting,Django中自定义计算排序的任何解决方案?我想创建一个视图,显示我博客中的热门帖子。排名将根据帖子的属性计算。假设我有3个称为x、y和z的整数域,排名计算将是x*y/z 有什么想法吗?我想做的顶级职位有史以来,以及其他变化过滤的时间,如过去24小时,7天,1个月,等等 谢谢 您可以使用检索额外的计算列并按其排序: MyModel.objects.filter(post_date__lt=#date#) .extra(select={'custom_order': "x*y/z"}

Django中自定义计算排序的任何解决方案?我想创建一个视图,显示我博客中的热门帖子。排名将根据帖子的属性计算。假设我有3个称为x、y和z的整数域,排名计算将是x*y/z

有什么想法吗?我想做的顶级职位有史以来,以及其他变化过滤的时间,如过去24小时,7天,1个月,等等

谢谢

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

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))

extra()queryset方法应该允许您这样做。请参见

因为在django中不能按方法和属性对查询集排序,所以必须在python中进行排序

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

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

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

谢谢!是的,我考虑过使用纯Python进行排序,但我担心这将意味着首先要进行大量选择,然后再使用Python进行排序。当然,我可能完全错了。当然,在数据库中进行排序通常效率更高,但这需要编写
sql
语句(取决于数据库)。另一方面,使用python排序可以确保始终使用独立于数据库的工作代码。这取决于每种情况(数据大小、响应时间、多个后端)来决定选择哪一个。更新使用新链接更新的文档