Python 通过@property对Django查询集排序
我试图对模型中定义的属性设置的查询进行排序,但不确定最好的方法。这里是酒店:Python 通过@property对Django查询集排序,python,django,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') 当然,呈现时会出现一个捕获到的Fiel
@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')
当然,呈现时会出现一个捕获到的FieldError:无法将关键字“name”解析到字段中
有什么想法吗
编辑:我知道我不能这样排序,因为
@属性
不是数据库字段。我的问题是,如果@property
不是数据库字段,如何进行排序。
发生在sql级别,因此它不能使用属性,只能使用字段数据
查看,您可以使用例如
extra
对查询进行注释并对其进行排序您只能按数据库字段排序。您可以提取所有记录,将它们转换为列表,并对它们进行排序,尽管这可能效率低下且速度缓慢
或者您可以添加一个名为
name
的数据库字段,并通过post save hook进行填充;然后,您可以使用order\u by
对其进行排序。您不能这样做,因为该属性不在MySQL中,而是在python代码中。如果您真的想这样做,您可以在客户端(尽管速度非常慢):
看一看。它允许您在数据库中维护计算值(然后您可以使用它高效地进行排序),而只需花费一个方法装饰器。这几乎是可行的,但它会返回奇数排序。基本上,对具有self.custom\u name的对象进行排序,然后对具有self.module\u object.name的对象进行排序。我只需要在不区分大小写的sortthanks的名称后面添加一个.lower()。。我已经看了Extra,但不确定如何将@property合并到it@brenden,则不合并该财产。在我的示例中,我需要将status=DRAFT(其中DRAFT='DRAFT')放在第一位。因此,我使用extra在select语句中插入了一个draft列,如果status=draft(排除status=DONE),则该列为true,并按如下顺序排列:MyModel.objects.exclude(status=DONE).extra(select={'draft':'status=%s'},select_params=[draft])。order_by('-draft'))
sorted(Thing.objects.all(), key=lambda t: t.name)