Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过@property对Django查询集排序_Python_Django - Fatal编程技术网

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)