Python Django HTTP请求获取与获取列表行为
我有一个Django表单,它向我的视图提交了一个值列表。我第一次尝试使用get方法检索列表,但发现它只返回最后一个,我应该使用getlist。经过一番周折,我找到了一个解释这种行为动机的方法: 这背后的原因是API方法应该一致地返回字符串或列表,但决不能同时返回两者。web应用程序中的常见情况是表单键与单个值关联,因此[]语法就是这样做的。getlist()适用于(像您的)打算对单个值多次使用一个键的情况Python Django HTTP请求获取与获取列表行为,python,django,Python,Django,我有一个Django表单,它向我的视图提交了一个值列表。我第一次尝试使用get方法检索列表,但发现它只返回最后一个,我应该使用getlist。经过一番周折,我找到了一个解释这种行为动机的方法: 这背后的原因是API方法应该一致地返回字符串或列表,但决不能同时返回两者。web应用程序中的常见情况是表单键与单个值关联,因此[]语法就是这样做的。getlist()适用于(像您的)打算对单个值多次使用一个键的情况 我只是想知道这是否真的是一种最佳实践——它与get方法在其他数据结构(如字典)上的工作方式
我只是想知道这是否真的是一种最佳实践——它与get方法在其他数据结构(如字典)上的工作方式相矛盾。HTTP请求确实支持为一个参数(键)分配多个值。这就是为什么人们可以使用它们,有时也会使用它们。这也是Django引入该结构的原因 分为
get()
和getlist()
是有益的,因为这有助于避免错误,并使查看代码保持简单。考虑其他行为,它们都需要更多的代码来做同样的事情:
始终返回列表 在大多数用例中,您只将一个值传递给一个键,因此您需要添加get()
,并以列表形式提供默认值[0]
param=request.GET.GET('param',['default value',])[0]
返回单个值或列表,具体取决于值的数量get()
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
行为。感谢您的概述,我得到了动机,但这对我来说仍然很奇怪,可能是因为我不习惯这种方法。我最终会将代码转换为相关类型,而不是依赖于方法,但我可以理解为什么您希望方法保持一致。