问题描述
我正在构建一个Django+DRF/React
应用程序(简单的博客应用程序),并且在保存嵌套图片方面遇到了困难
- 型号:
- 发布
- 儿童:
- 详细信息:ContentType模型(DRF:保存成功)
- 图像:ContentType模型(DRF:保存失败)
过程
-
从
<input type="file" multiple />
发送图像 -
通过
处理数据FormData
-
捕获
request.data
并对其进行处理class PostFormView(generics.RetrieveUpdateDestroyAPIView): queryset = Post._objects.is_active() serializer_class = PostModelSerializer permission_classes = (IsOwnerOr401,) parser_classes = (parsers.MultiPartParser,parsers.JSONParser,parsers.FormParser,parsers.FileUploadParser) lookup_field = 'slug' lookup_url_kwarg = 'slug' def get_queryset(self): return super().get_queryset().annotate(**sharedAnnotations(request=self.request)) def update(self,request,*args,**kwargs): data = request.data _images = data.getlist('images') images = [] for _ in _images: if isinstance(_,dict): images.append(images) continue images.append({'image': _,'object_id': self.get_object().pk,'content_type': self.get_object().get_content_type().pk}) data['images'] = images print(data) partial = kwargs.pop('partial',False) instance = self.get_object() serializer = self.get_serializer(instance,data=data,partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance,'_prefetched_objects_cache',None): instance._prefetched_objects_cache = {} return Response(serializer.data)
-
保存图像(失败):
class MediaModelSerializer(ContentTypeModelSerializer): # inherits object_id & content_type fields just to avoid writing them over and over alongside (create & update fns) class Meta: model = Media fields='__all__' class PostModelSerializer(WritablenestedModelSerializer): is_active = serializers.BooleanField(default=True) path = serializers.HyperlinkedIdentityField( view_name="api:post-detail",lookup_field='slug') images = MediaModelSerializer(many=True) details = DetailModelSerializer(required=False,many=True) # annotated fields is_author = serializers.BooleanField(read_only=True,default=False) class Meta: model = Post fields = '__all__' read_only_fields = ['is_locked','slug','user','is_author'] def create(self,validated_data): return super().create(validated_data) def update(self,instance,validated_data): return super().update(instance,validated_data)
-
print(data)
中的PostFormView.update(self,**kwargs)
语句(经过操作)返回以下内容:<QueryDict: {'id': ['8'],...,'images': [[{'image': <InMemoryUploadedFile: bmw_3.jpeg (image/jpeg)>,'object_id': 8,'content_type': 20},{'image': <InMemoryUploadedFile: bmw_2.jpeg (image/jpeg)>,{'image': <InMemoryUploadedFile: bmw_1.jpeg (image/jpeg)>,'content_type': 20}]]}>
-
服务器返回
400_BAD_REQUEST
,因为图像未传递到PostModelSerializer
{"images":["This field is required."]}
我已经面临这个问题3天了,我无法从根本上解决问题。
谢谢您的帮助。
解决方法
我一直在互联网上寻找,但是我找不到任何答案,所以我不得不走这条路
我从PostFormView.update(...)
中删除了处理部分,并直接通过images
的{{1}}和create
方法访问了update
。稍后我会弄清楚如何处理这些图像
这是代码:
ModelSerializer
如果任何人以前曾遇到过此问题并设法解决,请在下面发布您的答案。
谢谢!