我有一个Django表单,它在我的视图中提交了一个值列表。我首先尝试使用 get 方法检索列表,但发现它只返回了最后一个,我应该使用 getlist 。经过一些磕磕绊绊之后,我找到了closed Django bug来解释这种行为的动机:
这背后的原因是API方法应该始终返回字符串或列表,但不能同时返回两者。 Web应用程序中的常见情况是表单键与单个值相关联,因此这是[]语法的作用。当你打算多次使用一个键作为单个值时,getlist()适用于那些场合(比如你的)。
我只是想知道这是否真的是一种最佳实践 - 它与get方法在其他数据结构上的工作方式相矛盾,即。字典。
答案 0 :(得分:8)
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
行为会增加值。