通过@property对Django查询集进行排序

时间:2011-12-12 17:45:11

标签: python 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')

但当然在渲染时遇到Caught FieldError:无法将关键字'name'解析为字段。

有什么想法吗?

编辑:我知道我不能这样排序,因为@property不是数据库字段。我的问题是如果排序@property不是数据库字段。

4 个答案:

答案 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对其进行排序。