Django-3.1 / DRF / React:无法保存嵌套图像通过GenericRelation链接

问题描述

我正在构建一个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

如果任何人以前曾遇到过此问题并设法解决,请在下面发布您的答案。

谢谢!