2009-05-30 88 views
5

嘿,我想根据django中的计算值对对象进行排序......我该怎么做?如何根据django中的计算值进行排序

这里是一个基于堆栈溢出,说明我的困境的例子用户配置模式:

class Profile(models.Model): 
    user = models.ForeignKey(User) 

    def get_reputation(): 
     ... 
     return reputation 
    reputation = property(get_reputation) 

所以,说我想的信誉用户进行排序。我怎么做?我知道你不能只是这样做:

Profile.objects.order_by("-reputation") 

感谢您的帮助大家:)

回答

3

如果你需要做排序在数据库中(因为你有很多的记录,需要例如分页它们),唯一真正的选择是把口碑变成非规范化的领域(例如,在覆盖save()更新方法在模型上)。

16

由于仅存的Python的运算代码,你必须执行在Python中的排序,以及:

sorted (Profile.objects.all(), key = lambda p: p.reputation) 
+0

嘿,这是我问的问题的答案,但我接受了另一个,因为它解决了我的问题...特别是S.洛特的评论。我upmodded你的答案虽然:) – Jiaaro 2009-05-31 02:52:32

+0

有没有办法让这个返回一个查询集而不是一个普通的Python列表(或将列表转换为一个查询集)? – Jiaaro 2009-06-29 12:37:49

5

从Django-1.8开始,只要可以在SQL中呈现计算值,就可以使用query expressions对QuerySet进行排序。您也可以使用annotations作为order_by条款。

from django.db.models import F 
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation") 

+-*/**基本操作可以与F()使用。此外还有其他一些功能,如CountAvgMax,...

链接:

参见本SO Q & - 答:Order a QuerySet by aggregate field value

相关问题