Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Django-3.1/DRF/React:无法保存嵌套图像(通过GenericRelation链接)_Reactjs_Django_Django Rest Framework_Django Contenttypes - Fatal编程技术网

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

Reactjs Django-3.1/DRF/React:无法保存嵌套图像(通过GenericRelation链接),reactjs,django,django-rest-framework,django-contenttypes,Reactjs,Django,Django Rest Framework,Django Contenttypes,我正在构建一个Django+DRF/Reactapp(简单博客app),我在保存嵌套图像时遇到了困难 模型结构 型号: 职位 儿童: 详细信息:ContentType模型(DRF:保存成功) 图像:ContentType模型(DRF:保存未成功) 过程 从 通过FormData 捕获request.data并对其进行处理 class PostFormView(generics.RetrieveUpdateDestroyAPIView): queryset = Pos

我正在构建一个
Django+DRF/React
app(简单博客app),我在保存嵌套图像时遇到了困难

模型结构

  • 型号:
    • 职位
  • 儿童:
    • 详细信息:ContentType模型(DRF:保存成功)
    • 图像:ContentType模型(DRF:保存未成功)
过程

  • 通过
    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)
    
  • 保存图像(失败):

  • PostFormView.update(self、request、*args、**kwargs)中的
    print(data)
    语句(操作后)返回以下内容:

    <QueryDict: {'id': ['8'], ..., 'images': [[{'image': <InMemoryUploadedFile: bmw_3.jpeg (image/jpeg)>, 'object_id': 8, 'content_type': 20}, {'image': <InMemoryUploadedFile: bmw_2.jpeg (image/jpeg)>, 'object_id': 8, 'content_type': 20}, {'image': <InMemoryUploadedFile: bmw_1.jpeg (image/jpeg)>, 'object_id': 8, 'content_type': 20}]]}>
    
我已经面对这个问题三天了,我无法理解根本原因


谢谢你的帮助。

我一直在网上找,但是找不到任何人,所以我不得不走这条路

我已经从
PostFormView.update(…)
中删除了处理部分,并直接在
ModelSerializer
create
update
方法中访问了
图像。稍后,我将了解如何处理删除这些图像

代码如下:

class PostModelSerializer(WritableNestedModelSerializer):

    is_active = serializers.BooleanField(default=True)
    path = serializers.HyperlinkedIdentityField(
        view_name="api:post-detail", lookup_field='slug')

    images = MediaModelSerializer(read_only=True, 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):
        instance = super().create(validated_data)

        request = self.context.get('request', None)
        if request:
            try:
                images = request.data.getlist('images')
                for image in images:
                    self.instance.images.create(image=image)
            except Exception as e:
                pass

        return instance

    def update(self, instance, validated_data):
        instance = super().update(instance, validated_data)
        
        request = self.context.get('request', None)
        if request:
            try:
                images = request.data.getlist('images')
                for image in images:
                    self.instance.images.create(image=image)
            except Exception as e:
                pass

        return instance
如果有人曾经遇到过这个问题并设法解决了它,请在下面发布您的答案


谢谢大家!

我在互联网上到处找,但找不到任何人,所以我不得不走这条路

我已经从
PostFormView.update(…)
中删除了处理部分,并直接在
ModelSerializer
create
update
方法中访问了
图像。稍后,我将了解如何处理删除这些图像

代码如下:

class PostModelSerializer(WritableNestedModelSerializer):

    is_active = serializers.BooleanField(default=True)
    path = serializers.HyperlinkedIdentityField(
        view_name="api:post-detail", lookup_field='slug')

    images = MediaModelSerializer(read_only=True, 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):
        instance = super().create(validated_data)

        request = self.context.get('request', None)
        if request:
            try:
                images = request.data.getlist('images')
                for image in images:
                    self.instance.images.create(image=image)
            except Exception as e:
                pass

        return instance

    def update(self, instance, validated_data):
        instance = super().update(instance, validated_data)
        
        request = self.context.get('request', None)
        if request:
            try:
                images = request.data.getlist('images')
                for image in images:
                    self.instance.images.create(image=image)
            except Exception as e:
                pass

        return instance
如果有人曾经遇到过这个问题并设法解决了它,请在下面发布您的答案

谢谢大家!

class PostModelSerializer(WritableNestedModelSerializer):

    is_active = serializers.BooleanField(default=True)
    path = serializers.HyperlinkedIdentityField(
        view_name="api:post-detail", lookup_field='slug')

    images = MediaModelSerializer(read_only=True, 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):
        instance = super().create(validated_data)

        request = self.context.get('request', None)
        if request:
            try:
                images = request.data.getlist('images')
                for image in images:
                    self.instance.images.create(image=image)
            except Exception as e:
                pass

        return instance

    def update(self, instance, validated_data):
        instance = super().update(instance, validated_data)
        
        request = self.context.get('request', None)
        if request:
            try:
                images = request.data.getlist('images')
                for image in images:
                    self.instance.images.create(image=image)
            except Exception as e:
                pass

        return instance