python - Django HTTP 请求获取与获取列表行为

标签 python django

我有一个 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/

相关文章:

python - Python:计算观看视频的时间

python - 如何使用变量来切片 Python 列表?

django - 使用 SSL、AWS Load Balancer、Nginx 和 Gunicorn 的具有复杂堆栈的 Django Rest Framework 的错误超链接

javascript - 使用 Django,我如何在我的 javascript 中检测到管理员?

django - 在 Django 中向多对多关系添加记录的正确方法

python - 如何在没有管理验证的情况下制作 django 表单字段

javascript - HTML 上的 Django 导航文本

Python:如何用离散(分箱)值替换数组,而不是分箱编号?

python - 在单个 xtick 处获取单行数据的三个数据点

python - 提取 Pandas 中日期时间类型列的第一天