我正在尝试按照我在模型中定义的属性来设置查询集,但不确定执行此操作的最佳方法。这是属性:
@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')
但当然在渲染时遇到Caught FieldError:无法将关键字'name'解析为字段。
有什么想法吗?
编辑:我知道我不能这样排序,因为@property
不是数据库字段。我的问题是如果排序@property
不是数据库字段。
答案 0 :(得分:19)
你不能这样做,因为该属性不在MySQL中,而是在你的python代码中。如果你真的想这样做,你可以在客户端(虽然它会很慢):
sorted(Thing.objects.all(), key=lambda t: t.name)
答案 1 :(得分:2)
order_by
发生在sql级别,因此它不能使用属性,只能使用字段数据。
查看queryset api,您可以使用例如extra
注释您的查询并对该
答案 2 :(得分:2)
看看django-denorm。它允许您在数据库中维护计算值(然后可以使用它来有效排序),以获得单个方法装饰器的成本。
答案 3 :(得分:1)
您只能按数据库字段订购。您可以提取所有记录,将它们转换为列表,然后对它们进行排序,尽管这可能效率低且速度慢。
或者您可以添加一个名为name
的数据库字段,并通过保存后挂钩填充它;然后你可以使用order_by
对其进行排序。