如何在Django中按计算值排序
嘿,我想在Django中根据计算出来的值对对象进行排序...我该怎么做呢?
这里有一个基于Stack Overflow的用户资料模型的例子,说明了我的困境:
class Profile(models.Model):
user = models.ForeignKey(User)
def get_reputation():
...
return reputation
reputation = property(get_reputation)
假设我想根据用户的声誉来排序。那我该怎么做呢?我知道不能直接这样做:
Profile.objects.order_by("-reputation")
谢谢大家的帮助 :)
3 个回答
7
从Django-1.8开始,你可以使用查询表达式来对查询集进行排序,只要计算出的值能够用SQL表示出来。你还可以使用annotations
来给模型添加注释,作为order_by
的条件。
from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")
你可以使用基本的运算符,比如+
、-
、*
、/
和**
,与F()
一起使用。此外,还有一些其他的函数,比如Count
(计数)、Avg
(平均值)、Max
(最大值)等等。
相关链接:
还可以查看这个SO问答:根据聚合字段值对查询集进行排序
16
因为你的计算代码只在Python里面,所以你也得在Python里进行排序:
sorted (Profile.objects.all (), key = lambda p: p.reputation)
4
如果你需要在数据库里进行排序(比如你有很多记录,需要分页显示),唯一的真正选择就是把声望变成一个非规范化的字段(例如,在模型的一个重写的 save()
方法中更新它)。