如何将带有字符串数组的FormData属性从React Client发送到Django + Django Rest Framework API

时间:2018-11-19 23:52:35

标签: javascript django reactjs django-rest-framework form-data

我如何在form-data中发送JSON.stringify(array)数据并使用Django api解码JSON?

我正在尝试添加功能以在表单中上传日期字符串数组

最初,我们使用JSON发送帖子数据并发送有效的数据数组,但是,当我们切换到使用表单数据以使上传图片更容易时,我们开始遇到数组类型问题。

因为必须使用字符串类型发送表单数据,所以我使用JSON.stringify()转换了日期字符串数组

const myForm = new FormData();
myForm.set("date_strings", JSON.stringify(dateStrings));

当我将myForm发布到我的Django + DRF API时,它将以

响应
{
    "date_strings": [
        "Datetime has wrong format. Use one of these formats instead: YYYY-MM-DDThh:mm[:ss[.uuuuuu]][+HH:MM|-HH:MM|Z]."
    ],
    "status_code": 400
}

在Postman中,我验证了发送单个日期字符串的有效性,但是当我发送字符串数组时,我遇到了相同的错误。

我相信我的Django API会测试request.data是否有效,看到date_strings是JSON字符串,然后返回400错误。

        def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)

尝试的解决方案:

  1. PostViewset创建方法中将JSON字符串转换为数组
    • 我无法更改request.data['publish_dates'],因为它不可变,而且我已经看到一些建议,建议您不要尝试在视图集中复制或更改请求数据,因为它不安全。
  2. 将JSON字符串转换为序列化器中的数组

    • MySerializer的创建或验证方法均未运行(我登录进行测试)。
    • date_strings格式化并在create方法中创建为单独的PublishDate模型

      class MySerializer(MyChildSerializer):
          date_strings = serializers.ListField(child=serializers.DateTimeField(), min_length=1, max_length=100, write_only=True)
      

当一个属性是一组日期时间字符串时,如何将表单数据发送/接受到Django + DRF API?

1 个答案:

答案 0 :(得分:1)

我意识到了问题并找到了解决方案。由于MySerializer已将date_strings设置为ListField,因此它以字符串形式进入并且由于错误的请求而被拒绝。

通过将date_strings的模型更改为CharField,MySerializer运行validate和create方法。现在,我必须找到一种在序列化器create方法中将JSON date_strings转换回数组的方法,但是我解决了API的400问题。

MySerializer现在看起来像:

class CreatePostSerializer(SocialVeilModelSerializer):
     publish_dates = serializers.CharField(max_length=2000)