按 @property 对 Django 查询集排序

30 投票
4 回答
26784 浏览
提问于 2025-04-17 08:13

我想按照我在模型中定义的一个属性来排序查询结果,但不太确定最好的方法是什么。这个属性是:

@property
def name(self):
    if self.custom_name:
        return self.custom_name
    else:
        return self.module_object.name

简单来说,我想做一个:

things = Thing.objects.all().order_by('-name')

但在渲染的时候遇到了一个错误:无法将关键字 'name' 解析为字段。

有什么想法吗?

补充说明:我明白我不能这样排序,因为 @property 不是数据库字段。我的问题是,既然 @property 不是数据库字段,我该如何排序。

4 个回答

4

看看这个 django-denorm。它可以让你在数据库里保存一些计算出来的值(这样你就可以高效地进行排序),而且只需要用到一个方法装饰器。

4

order_by 是在数据库的 SQL 层面上进行的,所以它只能使用字段的数据,而不能使用属性。

你可以看看这个 查询集 API,也许你可以利用 extra 来给你的查询添加注释,然后根据这个进行排序。

45

你不能这样做,因为这个属性不在MySQL数据库里,而是在你的Python代码中。如果你真的想这么做,可以在客户端实现(不过会很慢):

sorted(Thing.objects.all(), key=lambda t: t.name)

撰写回答