首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-3.1/DRF/React:无法保存嵌套映像(通过GenericRelation链接)

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

Stack Overflow用户
提问于 2020-10-20 16:37:37
回答 1查看 89关注 0票数 1

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

模型结构

  • Post

  • 模型

)

  • 儿童:
    • 详细信息: ContentType模型( DRF: save是成功的)
    • 图像: ContentType模型( DRF : save不成功)

过程

<input type="file" multiple />

  • 发送图像

通过FormData实现

  • 处理数据

  • 捕获并处理request.data

类PostFormView(generics.RetrieveUpdateDestroyAPIView):queryset = Post._objects.is_active() serializer_class = PostModelSerializer permission_classes = (IsOwnerOr401,) parser_classes = (parsers.MultiPartParser,parsers.JSONParser,parsers.FormParser,( super().get_queryset().annotate(**sharedAnnotations(request=self.request)) ) parsers.FileUploadParser) lookup_field = 'slug‘lookup_url_kwarg =’self get_queryset(self):返回lookup_field更新(self,request,*args,**kwargs):data = request.data _images =data.getlist(‘图像’)_images= [] for _ in _images: if isinstance(_,dict):images.append(图像)继续images.append({'image':_,'object_id':self.get_object(),.pk,‘'content_type':self.get_object().get_content_type().pk})数据’图像‘=图像打印(数据)分部=kwargs.pop(’分部‘,False)实例= self.get_object()序列化程序=self.get_serializer(实例,data=data,Response(serializer.data) ( partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(序列化程序)如果getattr(例如,‘_pre提取_objects_cache’,无):instance._prefetched_objects_cache = {}返回self.perform_update

  • 保存图像(失败):

类MediaModelSerializer(ContentTypeModelSerializer):#继承object_id和content_type字段,以避免重复(创建和更新fns)类元: model =媒体字段=‘_all_ class is_active = serializers.BooleanField(default=True) path = serializers.HyperlinkedIdentityField( view_name=“api:post- details”),查找_field=’slug‘图像= MediaModelSerializer(many=True) details= DetailModelSerializer(required=False ),many=True) #注释字段is_author = serializers.BooleanField(read_only=True,default=False)类Meta: model = Post字段= '__all__‘read_only_fields = 'is_locked','slug','user','is_author’def创建(self,validated_data):返回超级().create(Validated_data) def更新(self,实例,):返回超级() validated_data) (实例,validated_data).update

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

,'object_id':8,'content_type':20},{'image':,'object_id':8,‘content_type’20},{‘bmw_1.jpeg’:

  • 服务器返回400_BAD_REQUEST,因为图像没有传递给PostModelSerializer

{“图像”:“此字段是必需的。”}

我已经面对这个问题三天了,我不能把我的头绕在根本原因上。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-10-20 22:49:26

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

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

下面是代码:

代码语言:javascript
复制
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

如果以前有人遇到过这个问题,并设法解决了,请将你的答案贴在下面。

谢谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64449602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档