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



如何在表单数据中发送JSON.stringfy(数组(数据,并使用Django api解码JSON

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

最初,我们使用JSON发送post数据,并且发送数据数组是有效的,然而,当我们为了更容易上传图像而改用表单数据时,我们开始遇到数组类型的问题。

由于表单数据必须使用字符串类型发送,我使用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字符串,然后返回400Error。

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

尝试的解决方案:

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

    • MySerializer的创建和验证方法都没有运行(我登录到测试(
    • date_string在create方法中被格式化并创建为单独的PublishDate模型

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

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

我意识到了这个问题并找到了解决方案。因为MySerializer将date_strings设置为ListField,所以它以字符串的形式出现,并作为错误请求被拒绝。

通过将datestring的模型更改为CharField,MySerializer运行validate和create方法。我现在必须在serializer create方法中将JSON日期字符串转换回数组,但我解决了API的400问题。

MySerializer现在看起来像:

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

最新更新