我有一个 Django 表单,它向我的 View 提交了一个值列表。我首先尝试使用 get 方法检索列表,但发现它只返回最后一个,我应该使用 getlist。经过一番摸索,我发现了一个 closed Django bug这解释了这种行为的动机:
The reasoning behind this is that an API method should consistently return either a string or a list, but never both. The common case in web applications is for a form key to be associated with a single value, so that's what the [] syntax does. getlist() is there for the occasions (like yours) when you intend to use a key multiple times for a single value.
我只是想知道这是否真的是最佳实践 - 它与 get 方法在其他数据结构上的工作方式相矛盾,即。字典。
最佳答案
HTTP 请求确实支持将多个值分配给一个参数(键)。这就是人们可以使用它们并且确实(有时)使用它们的原因。这也是 Django 引入 MultiValueDict
的原因。结构。
分为 get()
和 getlist()
是有益的,因为它可以帮助您避免错误并保持 View 代码简单。考虑其他行为,它们都需要更多代码来完成完全相同的事情:
get()
始终返回列表。在大多数情况下,您只将一个值传递给一个键,因此您需要添加
[0]
并提供默认值作为列表。param = request.GET.get('param', ['默认值',])[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
行为具有附加值。
关于python - Django HTTP 请求获取与获取列表行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9143872/