jquery - 如何序列化发布到 django 后端的数组

标签 jquery python django serialization django-serializer

我正在尝试序列化来自表单的数组。该数组如下所示:

some_id: 12
array1[]:1
array1[]:2
array2[]:5
array2[]:6

或者,当它到达 request.POST

<QueryDict: {
    'array1[]': ['1', '2'], 
    'array2[]': ['5', '6'], ...

现在我让序列化器为简单的 id 工作:some_id = serializers.IntegerField(),这很棒。我已经在没有数组的情况下对其进行了测试,一切都按预期工作。

对于数组,我认为我找到了这个序列化器字段:listfield
我尝试了以下实现:

array1 = serializers.ListField(
    child=serializers.IntegerField(min_value=1)
)

这看起来像手册说明了它是如何工作的,但它似乎只给了我以下错误:

TypeError at /api/myendpoint/ 'int' object is not iterable

我不太确定我哪里出了问题,也许我走错了路(真的不是 Django 人:)),但我确信这是一个小错误。

那么如何序列化发布的数组(或者我应该将其称为字典?)

完整的跟踪似乎不包含任何奇怪的东西,但我保留了它on pastebin

使用以下 jquery 代码发布数据:

var mydata = {
    array1: [1,2],
    array2: [5,6],
    some_id: 12
};

$.ajax({
    url: "http://domain.com//api/myendpoint/",
    dataType: "json",
    data: mydata,
    method: "POST"
})

我正在使用:

  • Django 1.10.2
  • djangorestframework 3.5.2
  • jquery 2.1.4

最佳答案

长话短说:我已将其添加到我的 JavaScript 中:

jQuery.ajaxSettings.traditional = true;

现在它的工作原理正如您所期望的

短篇故事长:

最大的问题是“简单”的帖子并不像我想象的那么简单。从问题来看,这就是 jQuery 发布的内容:

some_id: 12
array1[]:1
array1[]:2
array2[]:5
array2[]:6

从前端发送的对象,预期在后端包含名为 array1array2 的属性,但发送的实际上是 array1[ ]array2[]。虽然 Daniel van Flymen 的解决方案可能会使用这些属性,但我一直在考虑修复这些括号。

来自this rather old jquery topic我发现 jQuery 为 phpruby 等语言添加了这些,但我发现:python 不喜欢它

添加 jQuery.ajaxSettings.traditional = true; 后, header 现在如下所示:

some_id: 12
array1:1
array1:2
array2:5
array2:6

这就是序列化器所期望的理解。

关于jquery - 如何序列化发布到 django 后端的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41815269/

相关文章:

python - celeryd任务导入错误

python - 为什么我的链接提取不起作用?

python - Unicode 解码错误

jquery - 如何为检查 json 数据的 div 设置不同的类

jquery - 从ajax调用返回变量的函数

python - 将 Python 函数中的所有变量设为全局变量

python - Django 和 CFR 21 第 11 部分

python - 主键和唯一约束上的 Django 模型 unique_together

jquery:读取div id并删除适当的div?

javascript - 移动 View 中的标题 chop