如何在Django中按计算值排序

7 投票
3 回答
8073 浏览
提问于 2025-04-15 11:56

嘿,我想在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() 方法中更新它)。

撰写回答