Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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 异常捕获Django订单_Python_Django_Django Models - Fatal编程技术网

Python 异常捕获Django订单

Python 异常捕获Django订单,python,django,django-models,Python,Django,Django Models,我想让用户通过API对对象进行排序来获取对象:example.com/foo?sort_by=STR。我将在中使用STR。order\u by 我发现如果Django不能按STR排序(如果STR关键字在字段中不存在),则很难捕获FieldError,因为查询集是惰性的 foo_set=foo.objects.order_by('bar')#不会引发异常 返回foo_set[:10]#将抛出FieldError 我无法检查以前是否存在STR字段,因为我想让用户按相反顺序排序(foo.order\

我想让用户通过API对对象进行排序来获取对象:
example.com/foo?sort_by=STR
。我将在
中使用
STR
。order\u by

我发现如果Django不能按
STR
排序(如果
STR
关键字在字段中不存在),则很难捕获
FieldError
,因为查询集是惰性的

foo_set=foo.objects.order_by('bar')#不会引发异常
返回foo_set[:10]#将抛出FieldError
我无法检查以前是否存在
STR
字段,因为我想让用户按相反顺序排序(
foo.order\u by('-bar')
)。因此,我将
foo\u集[0]
放在
try
中,但这很可怕(如果foo\u集为空,则例外,硬编码获取第一个元素)

试试看:
富集[0]
除字段错误外:
处理错误请求(…)
除索引器外:
通过
dirkgroten建议获取QuerySet列表,您将使用什么方式进行检查?

来回答“如何捕获该异常”的问题。这迫使Django尝试按顺序运行,从而引发异常

试试看:
list(Foo.objects.order_by('blahblah'))35;抛出异常
除字段错误外:
...
但在我的情况下(以及用户给出明确字段名的情况下),最好在订购前进行检查。此外,按每个名称(
Foo.\u meta.fields
可以提供的内容)进行检查是不安全的,因为某些数据(即id)不能显示。因此,我创建了一个“安全”名称的元组,并检查
STR
是否在该元组中

field_names=('show_until','title')#“safe”字段名
sort_by=request.GET.GET('sort_by','title')#提醒我获取STR作为参数
如果排序依据不在字段名称中:#如果STR不在“安全”名称中
返回HttpResponseBadRequest(
'排序依据应为存在的字段名。选项为:{}。'。格式(
“,”。联接(字段名称)
)#然后根据需要进行处理
)
要回答“如何捕获该异常?”的问题,dirkgroten建议获取QuerySet列表。这迫使Django尝试按顺序运行,从而引发异常

试试看:
list(Foo.objects.order_by('blahblah'))35;抛出异常
除字段错误外:
...
但在我的情况下(以及用户给出明确字段名的情况下),最好在订购前进行检查。此外,按每个名称(
Foo.\u meta.fields
可以提供的内容)进行检查是不安全的,因为某些数据(即id)不能显示。因此,我创建了一个“安全”名称的元组,并检查
STR
是否在该元组中

field_names=('show_until','title')#“safe”字段名
sort_by=request.GET.GET('sort_by','title')#提醒我获取STR作为参数
如果排序依据不在字段名称中:#如果STR不在“安全”名称中
返回HttpResponseBadRequest(
'排序依据应为存在的字段名。选项为:{}。'。格式(
“,”。联接(字段名称)
)#然后根据需要进行处理
)

如果您不打算进一步处理查询集(代码路径的下一步),并且无论如何都要对其进行计算,您可以通过设置
foo\u set=list(foo.objects.order\u by('bar')
强制对其进行计算,这将引发异常。但是为什么不实际检查
STR
是否是一个字段呢(如果第一个
-
字符在那里,你可以很容易地删除它)。@dirkgroten,现在我正在考虑检查
STR
是否在
中(f.name代表Foo中的f.\u meta.fields)
并添加第二个可选参数
reversed=true
。是的,我认为这将是一种更简洁的方法。您还可以添加一个安全字段列表,以便在模型中按顺序排序,并使用它(一般来说,我认为第三方不能按我的模型上的所有字段进行订购,因为有些可能会泄露敏感信息,例如id告诉某人您有多少条记录,日期字段告诉某人上次添加/更新记录的时间).@dirkgroten,你说得对!谢谢。如果你不打算进一步处理查询集(代码路径的下一步)并且它无论如何都会被计算,你可以通过设置
foo\u set=list(foo.objects.order\u by('bar')
强制它进行计算,这将抛出你的异常。但是为什么不实际检查
STR
是否是一个字段呢(如果第一个
-
字符在那里,你可以很容易地删除它)。@dirkgroten,现在我正在考虑检查
STR
是否在
中(f.name代表Foo中的f.\u meta.fields)
并添加第二个可选参数
reversed=true
。是的,我认为这将是一种更简洁的方法。您还可以添加一个安全字段列表,以便在模型中按顺序排序,并使用它(一般来说,我认为第三方不能按我模型上的所有字段进行订购,因为有些可能会泄露敏感信息,例如id告诉某人你有多少记录,日期字段告诉某人上次添加/更新记录的时间)。@dirkgroten,你说得对!谢谢。