如何序列化发布到 Django 后端的数组
How to serialize an array posted to a django backend
我正在尝试序列化来自表单的数组。该数组如下所示:
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
您的值未作为数组发送。它们作为单独的密钥发送。
如果您打算将键反序列化为数组,那么您可以覆盖序列化程序上的 to_internal_value()
方法:
class CustomSerializer(serializers.Serializer):
my_array = serializers.ListField(
child=serializers.IntegerField(min_value=1)
)
def to_internal_value(self, data):
my_array = []
for key, value in data.items():
if "array[]" in key:
my_array.append(value)
# Perform some validation on your array
for item in array:
if item > 10:
raise ValidationError(
{
'my_array': "A number was higher than 10."
}
)
# Return the validated values
return {
'my_array': my_array
}
to_internal_value()
方法负责反序列化数据。希望这能为您指明正确的方向。
请务必查看 to_internal_value()
上 documentation 中的示例。
长话短说:我已将此添加到我的 javascript:
jQuery.ajaxSettings.traditional = true;
现在一切如您所愿
长篇小说:
最大的问题是 'simple' post 并不像我想的那么简单。从问题来看,这就是 jQuery 是 posting:
some_id: 12
array1[]:1
array1[]:2
array2[]:5
array2[]:6
从前端发送的 object 预计在后端包含名为 array1
和 array2
的属性,但实际发送的是 array1[]
和 array2[]
。虽然 Daniel van Flymen 的解决方案可能会使用这些属性,但我一直在考虑修复这些括号。
从 this rather old jquery topic 我发现 jQuery 为 php
和 ruby
这样的语言添加了这些,但我发现:python 没有喜欢
加上 jQuery.ajaxSettings.traditional = true;
,headers 现在看起来像这样:
some_id: 12
array1:1
array1:2
array2:5
array2:6
这是序列化程序理解的预期内容。
我正在尝试序列化来自表单的数组。该数组如下所示:
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
您的值未作为数组发送。它们作为单独的密钥发送。
如果您打算将键反序列化为数组,那么您可以覆盖序列化程序上的 to_internal_value()
方法:
class CustomSerializer(serializers.Serializer):
my_array = serializers.ListField(
child=serializers.IntegerField(min_value=1)
)
def to_internal_value(self, data):
my_array = []
for key, value in data.items():
if "array[]" in key:
my_array.append(value)
# Perform some validation on your array
for item in array:
if item > 10:
raise ValidationError(
{
'my_array': "A number was higher than 10."
}
)
# Return the validated values
return {
'my_array': my_array
}
to_internal_value()
方法负责反序列化数据。希望这能为您指明正确的方向。
请务必查看 to_internal_value()
上 documentation 中的示例。
长话短说:我已将此添加到我的 javascript:
jQuery.ajaxSettings.traditional = true;
现在一切如您所愿
长篇小说:
最大的问题是 'simple' post 并不像我想的那么简单。从问题来看,这就是 jQuery 是 posting:
some_id: 12
array1[]:1
array1[]:2
array2[]:5
array2[]:6
从前端发送的 object 预计在后端包含名为 array1
和 array2
的属性,但实际发送的是 array1[]
和 array2[]
。虽然 Daniel van Flymen 的解决方案可能会使用这些属性,但我一直在考虑修复这些括号。
从 this rather old jquery topic 我发现 jQuery 为 php
和 ruby
这样的语言添加了这些,但我发现:python 没有喜欢
加上 jQuery.ajaxSettings.traditional = true;
,headers 现在看起来像这样:
some_id: 12
array1:1
array1:2
array2:5
array2:6
这是序列化程序理解的预期内容。