Python Django HTTP请求获取与获取列表行为

Python Django HTTP请求获取与获取列表行为,python,django,Python,Django,我有一个Django表单,它向我的视图提交了一个值列表。我第一次尝试使用get方法检索列表,但发现它只返回最后一个,我应该使用getlist。经过一番周折,我找到了一个解释这种行为动机的方法: 这背后的原因是API方法应该一致地返回字符串或列表,但决不能同时返回两者。web应用程序中的常见情况是表单键与单个值关联,因此[]语法就是这样做的。getlist()适用于(像您的)打算对单个值多次使用一个键的情况 我只是想知道这是否真的是一种最佳实践——它与get方法在其他数据结构(如字典)上的工作方式

我有一个Django表单,它向我的视图提交了一个值列表。我第一次尝试使用get方法检索列表,但发现它只返回最后一个,我应该使用getlist。经过一番周折,我找到了一个解释这种行为动机的方法:

这背后的原因是API方法应该一致地返回字符串或列表,但决不能同时返回两者。web应用程序中的常见情况是表单键与单个值关联,因此[]语法就是这样做的。getlist()适用于(像您的)打算对单个值多次使用一个键的情况


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

HTTP请求确实支持为一个参数(键)分配多个值。这就是为什么人们可以使用它们,有时也会使用它们。这也是Django引入该结构的原因

分为
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
行为。

感谢您的概述,我得到了动机,但这对我来说仍然很奇怪,可能是因为我不习惯这种方法。我最终会将代码转换为相关类型,而不是依赖于方法,但我可以理解为什么您希望方法保持一致。