繁体   English   中英

Django HTTP请求get vs getlist行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM