在Django中进行自定义计算排序的任何解决方案?我想创建一个视图,显示我的博客中的热门帖子。排名将通过Post的属性进行计算。我们只需说我有3个IntegerFields,分别称为x,y和z,排名计算为x * y/z。在Django中通过计算自定义排序
任何想法?我想要做Top Top,以及过去24小时,7天,1个月等时间过滤的其他变体。
谢谢!
在Django中进行自定义计算排序的任何解决方案?我想创建一个视图,显示我的博客中的热门帖子。排名将通过Post的属性进行计算。我们只需说我有3个IntegerFields,分别称为x,y和z,排名计算为x * y/z。在Django中通过计算自定义排序
任何想法?我想要做Top Top,以及过去24小时,7天,1个月等时间过滤的其他变体。
谢谢!
可以使用extra
通过它来获取额外的计算列(S)和排序:
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))
由于您无法通过django中的方法和属性对查询集进行排序,您必须在python中进行排序。
考虑将您计算字段为property你的模型,那么您可以在您的视图做到这一点:
sorted_posts = sorted(Post.objects.all(), key=lambda post: post.calculated_field)
最后你可以通过sorted_posts
到您的列表模板。
谢谢!是的,我想过用纯Python进行排序,但我担心这意味着首先要完成一个大的SELECT,然后再用Python进行排序。当然,我可能完全错了。 – rabbid 2011-04-12 14:08:04
当然,在数据库中进行排序大多数情况下效率更高,但这需要编写'sql'语句(依赖于数据库)。另一方面,使用python排序可以确保始终与数据库无关的工作代码。它取决于每种情况(数据大小,响应时间,多个后端)来决定选择哪一个。 – manji 2011-04-12 14:19:42
伟大的观点。非常感谢! – rabbid 2011-04-14 02:15:23