Skip to main content
 首页 » 编程设计

jquery之如何序列化发布到 Django 后端的数组

2024年08月21日38lexus

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

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 人 :) ),但我确定这是一个小错误。

那么我如何序列化发布的数组(或者我应该称它为 Dict?)

完整的轨迹似乎没有包含任何奇怪的东西,但我一直保持可用 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
  • djangorest 框架 3.5.2
  • jquery 2.1.4

请您参考如下方法:

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

jQuery.ajaxSettings.traditional = true; 

现在它像您期望的那样工作

长篇小说:

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

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

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

来自 this rather old jquery topic我发现 jQuery 为 php 和 ruby 这样的语言添加了这些,但我发现:python 不喜欢它

通过添加 jQuery.ajaxSettings.traditional = true;, header 现在看起来像这样:

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

这就是序列化程序所理解的。