[英]Django HTTP Request get vs getlist behavior
我有一个Django表单,提交了一个值列表给我的视图。 我首先尝试使用get方法检索列表,但发现它只返回了最后一个,我应该使用getlist 。 在一些绊脚石后,我发现了一个封闭的Django错误 ,解释了这种行为的动机:
这背后的原因是API方法应该始终返回字符串或列表,但不能同时返回两者。 Web应用程序中的常见情况是表单键与单个值相关联,因此这是[]语法的作用。 当你打算多次使用一个键作为单个值时,getlist()适用于那些场合(比如你的)。
我只是想知道这是否真的是一种最佳实践 - 它与get方法在其他数据结构上的工作方式相矛盾,即。 字典。
HTTP请求确实支持分配给一个参数(密钥)的多个值。 这就是人们可以使用它们并且(有时)使用它们的原因。 这也是Django引入MultiValueDict
结构的原因。
分为get()
和getlist()
是有益的,因为它可以帮助您避免错误并保持您的视图代码简单。 考虑其他行为,它们都需要更多代码来完成同样的事情:
get()
总是返回列表。
在大多数用例中,您只将一个值传递给一个键,因此您需要添加[0]
并将默认值作为列表提供。
param = request.GET.get('param', ['default value',])[0]
get()
返回单个值或列表,具体取决于值的数量。
HTML选择中存在一个缺点,允许多个选项。 人们可以选择零,一个或多个值。 这意味着您需要自己将单个值转换为列表或相反方向:
params = request.GET.get('params', [])
# Here you have absolutely no idea if this is a list or a single value
# But you will need only one of that types
# If you need list: ---------------------------------
if not isinstance(params, list):
params = [params,]
objs = TestModel.objects.filter(id__in=params).all()
# If you need single value: -------------------------
if isinstance(params, list):
params = params[0] # Error if params is empty list...
obj = TestModel.objects.get(id=params)
get()
总是返回单个值。 那么在这种情况下如何在没有getlist
的情况下处理多个值? 所以为了回答你的问题, get/getlist
行为有一个附加价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.