我正在尝试添加功能以在表单中上传日期字符串数组
最初,我们使用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)
PostViewset
创建方法中将JSON字符串转换为数组
request.data['publish_dates']
,因为它不可变,而且我已经看到一些建议,建议您不要尝试在视图集中复制或更改请求数据,因为它不安全。将JSON字符串转换为序列化器中的数组
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?
答案 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)