Django HTTP请求get vs getlist行为

时间:2012-02-04 19:35:53

标签: python django

我有一个Django表单,它在我的视图中提交了一个值列表。我首先尝试使用 get 方法检索列表,但发现它只返回了最后一个,我应该使用 getlist 。经过一些磕磕绊绊之后,我找到了closed Django bug来解释这种行为的动机:

  

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

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

1 个答案:

答案 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行为会增加值。