如何在 django 中按计算值排序
-
06-09-2019 - |
题
嘿,我想根据 django 中的计算值对对象进行排序...我该怎么做?
这是一个基于堆栈溢出的用户配置文件模型示例,它解释了我的困境:
class Profile(models.Model):
user = models.ForeignKey(User)
def get_reputation():
...
return reputation
reputation = property(get_reputation)
因此,假设我想按声誉对用户进行排序。我怎么做?我知道你不能这样做:
Profile.objects.order_by("-reputation")
谢谢大家的帮助 :)
解决方案
如果你需要做排序在数据库中(因为你有很多的记录,需要例如分页它们),唯一真正的选择是把口碑变成非规范化的领域(例如,在被覆盖的save()
方法更新模型)。
其他提示
由于你的计算代码仅在Python的存在,必须执行在Python排序,以及:
sorted (Profile.objects.all (), key = lambda p: p.reputation)
从 Django-1.8 开始,可以使用以下命令对 QuerySet 进行排序 查询表达式 只要计算值可以用 SQL 呈现即可。您还可以使用 annotations
将模型作为 order_by
学期。
from django.db.models import F
Profile.objects.annotate(reputation=(F('<field>') + ...)).order_by("-reputation")
基本操作如 +
, -
, *
, /
和 **
可以与 F()
. 。除此之外,还有其他一些功能,例如 Count
, Avg
, Max
, ...
链接:
另请参阅此问答: 按聚合字段值对查询集进行排序
不隶属于 StackOverflow