2011-04-12 33 views
1

在Django中进行自定义计算排序的任何解决方案?我想创建一个视图,显示我的博客中的热门帖子。排名将通过Post的属性进行计算。我们只需说我有3个IntegerFields,分别称为x,y和z,排名计算为x * y/z。在Django中通过计算自定义排序

任何想法?我想要做Top Top,以及过去24小时,7天,1个月等时间过滤的其他变体。

谢谢!

回答

3

可以使用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)) 
+0

谢谢!是的,我想过用纯Python进行排序,但我担心这意味着首先要完成一个大的SELECT,然后再用Python进行排序。当然,我可能完全错了。 – rabbid 2011-04-12 14:08:04

+0

当然,在数据库中进行排序大多数情况下效率更高,但这需要编写'sql'语句(依赖于数据库)。另一方面,使用python排序可以确保始终与数据库无关的工作代码。它取决于每种情况(数据大小,响应时间,多个后端)来决定选择哪一个。 – manji 2011-04-12 14:19:42

+0

伟大的观点。非常感谢! – rabbid 2011-04-14 02:15:23

0

extra()queryset方法应该允许您执行此操作。请参阅the docs

+0

更新文档https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra – Windsooon 2016-05-03 14:30:06

+0

用新链接更新 – shadfc 2016-08-26 16:54:42

-1

由于您无法通过django中的方法和属性对查询集进行排序,您必须在python中进行排序。

考虑将您计算字段为property你的模型,那么您可以在您的视图做到这一点:

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

最后你可以通过sorted_posts到您的列表模板。