Django如何通过POST请求正确接收多图上传并适配React Native端
问题1:request.data不可变无法修改的原因与解决方法
DRF的request.data在处理multipart/form-data类型的请求时,默认返回的是不可变QueryDict对象,直接修改就会报错。你不需要修改原始的request.data,只需要先拷贝一份可变副本操作即可,修改后的核心逻辑如下:
class PostView(APIView): def post(self, request): # 先拷贝得到可变的字典 data = request.data.copy() post_body = data['body'] hash_tags_list = extract_hashtags(post_body) hash_tags = [HashTag.objects.get_or_create( hash_tag=ht)[0].hash_tag for ht in hash_tags_list] # 操作拷贝后的data data['hash_tags'] = hash_tags # 把拷贝后的data传给序列化器 serializer = PostSerializer(data=data) if serializer.is_valid(): try: post_obj = serializer.save() if 'images' in request.FILES: for img in request.FILES.getlist('images'): Photo.objects.create(post_id=post_obj, image=img) except django.db.utils.InternalError as e: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) return Response(serializer.data, status=status.HTTP_201_CREATED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
你之前测试时直接读取文件字节传入请求的方式是错误的,这种方式不会被DRF识别为上传文件,会被当作普通字节数据存入request.data,自然会触发不可变报错。
问题2:是否可以正常接收React Native端上传的多张图片
只要React Native端按照标准的multipart/form-data格式发送请求,多张图片的字段名统一为images,你的现有逻辑就可以正常接收:
- 前端上传的图片不管是本地文件封装的FormData数据,还是ByteIO格式,只要符合multipart规范,DRF都会自动解析为
UploadedFile对象存入request.FILES - 你用
request.FILES.getlist('images')获取多图、逐个写入Photo表的逻辑是正确的,ImageField可以直接处理这些上传文件对象,不需要额外做字节转换。
本地测试参考写法
如果要用Python本地测试接口,正确的请求写法如下:
import requests url = "你的接口地址" data = {"body": "测试内容 #标签1 #标签2"} # 多图就追加列表元素,字段名统一为images files = [ ("images", open("test1.png", "rb")), ("images", open("test2.png", "rb")) ] response = requests.post(url, data=data, files=files)
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

