按 @property 对 Django 查询集排序
我想按照我在模型中定义的一个属性来排序查询结果,但不太确定最好的方法是什么。这个属性是:
@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)