Django HTTP请求get vs getlist行为

Dan*_*din 5 python django

我有一个Django表单,提交了一个值列表给我的视图.我首先尝试使用get方法检索列表,但发现它只返回了最后一个,我应该使用getlist.在一些绊脚石后,我发现了一个封闭的Django错误,解释了这种行为的动机:

这背后的原因是API方法应该始终返回字符串或列表,但不能同时返回两者.Web应用程序中的常见情况是表单键与单个值相关联,因此这是[]语法的作用.当你打算多次使用一个键作为单个值时,getlist()适用于那些场合(比如你的).

我只是想知道这是否真的是一种最佳实践 - 它与get方法在其他数据结构上的工作方式相矛盾,即.字典.

Mar*_*mro 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)
Run Code Online (Sandbox Code Playgroud)
  • get()总是返回单个值.那么getlist在没有这种情况下你如何处理多个值呢?

所以,为了回答你的问题,get/getlist行为有附加价值.