zoukankan      html  css  js  c++  java
  • put请求(单整体改),patch请求(群单改,群改)

    put请求
    接口:urlpatterns = [
    url(r'^v2/book/$', views.Bookv2.as_view()),
    url(r'^v2/book/(?P<pk>.*)/$', views.Bookv2.as_view()),
    ]
    单整体改一般用put
    参数:
    如果partial值设置为True,就是可以局部改
    1)单整体修改,一般用put请求:
    V2BookModelSerializer(
    instance=要被更新的对象,
    data=用来更新的数据,
    partial=默认False,必须的字段全部参与校验
    )

    实现:单整体修改
    # 单整体改 :对 v2/book/(pk)/访问要把pk传入,然后instance=修改的对象
    # Bookv2ModelSerializer(instance=修改的对象, data=request_data,partial=默认False)
        def put(self, request, *args, **kwargs):
            request_data = request.data
            pk = kwargs.get('pk')
            old_book_obj = models.Book.objects.filter(pk=pk).first()  # 获取obj
            # 目的:将众多数据的校验交给序列化来处理,让序列化类进行反序列化操作,校验成功后入库
            # data传入数据是进行校验,并且才能走.is_valid(raise_exception=True)校验是否成功
            # instance如若有值,save走的是update操作,进行修改操作
            book_ser = serializers.Bookv2ModelSerializer(instance=old_book_obj, data=request_data)
            book_ser.is_valid(raise_exception=True)  # raise_exception=True如果问题抛出异常
            book_ser.save()
            return Response({
                'status': 0,
                'msg': '修改成功',
                "results": book_ser.data
            })

    patch请求:
    接口:urlpatterns = [
    url(r'^v2/book/$', views.Bookv2.as_view()),
    url(r'^v2/book/(?P<pk>.*)/$', views.Bookv2.as_view()),
    ]
    参数:
    单局部修改,一般用patch请求:
    V2BookModelSerializer(
    instance=要被更新的对象,
    data=用来更新的数据,
    partial=设置True,必须的字段都变为选填字段)
    注:partial设置True的本质就是使字段 required=True 校验规则失效
    # 单局部改 :只需要在序列化类参数加上partial=True,就能进行局部修改
    # Bookv2ModelSerializer(instance=old_book_obj, data=request_data,partial=True)
        def patch(self, request, *args, **kwargs):
            request_data = request.data
            pk = kwargs.get('pk')
            old_book_obj = models.Book.objects.filter(pk=pk).first()
            # partial=True
            book_ser = serializers.Bookv2ModelSerializer(instance=old_book_obj, data=request_data,partial=True)
            book_ser.is_valid(raise_exception=True)
            book_ser.save()
            return Response({
                'status': 0,
                'msg': '修改成功',
                "results":serializers.Bookv2ModelSerializer(old_book_obj).data
            })
       
    # 群局部改(单局部改):请求数据 -[{pk:1,name=123},{pk:2,name=456},{pk:8,price:666}]
    def patch(self, request, *args, **kwargs):
            request_data = request.data
            pk = kwargs.get('pk')
            if pk and isinstance(request_data, dict):  # 单改
                pks = [pk, ]
                request_data = [request_data, ]
            elif isinstance(request_data, list):  # 群改
                pks = []
                for dic in request_data:
                    # 字典是可变类型,在弹出的时候,原生的字典也会改变,dic的指向依然是request_data内存地址,dic变,它也变
                    pk = dic.pop('pk', None)
                    if pk:
                        pks.append(pk)  # 把pk值弹出来,加入pks
                    else:
                        return Response({
                            'status': 2,
                            'msg': '数据有误',
                        })
            else:
                return Response({
                    'status': 1,
                    'msg': '数据有误',
                })
    
            # pks与request_data数据筛选
            # 1.将pks中的没有对应数据的pk与数据已删除的数据pk移除,request_data索引对应的数据也移除
            # 2.将合理的pks转换为对象
            obj_list = []
            new_request_data = []
            for index, pk in enumerate(pks):
                try:
                    # pk对应的数据合理,将合理的对象存储,并把删除的数据过滤掉
                    obj = models.Book.objects.get(pk=pk,is_delete=False)
                    obj_list.append(obj)
                    # 对应索引的数据就需要保存下来
                    new_request_data.append(request_data[index])
                except:
                    # pk对应的数据有误,将对应索引的data从request_data中移除
                    # request_data.pop(index)
                    continue
            book_ser = serializers.Bookv2ModelSerializer(instance=obj_list, data=new_request_data, partial=True, many=True)
            book_ser.is_valid(raise_exception=True)
            book_objs = book_ser.save()
            return Response({
                'status': 0,
                'msg': '修改成功',
                "results": serializers.Bookv2ModelSerializer(book_objs, many=True).data
            })
    # 群改
    # 重点:ModelSerializer与ListSerializer建立关联的是:
    # 在ModelSerializer类的 Metalist_serializer_class = Bookv2ListSerializer建立联系
    class Bookv2ListSerializer(ListSerializer):
        def update(self, instance, validated_data):
            print(instance)  # book对应各个对象
            print(validated_data)  # 修改的数据
            print(self.child)  # 服务模型序列化的类
            for index, obj in enumerate(instance):
                self.child.update(obj, validated_data[index])
            return instance

    序列化类
    # 整合序列化和反序列化
    class Bookv2ModelSerializer(ModelSerializer):
        # publishs = PublishModelSerializer()
        class Meta:
            model = models.Book
            fields = ('name', 'price', 'img', 'publish_name', 'author_list', 'publish', 'authors')
    
            # 群改,需要设置 自定义ListSerializer,重写update方法
            list_serializer_class = Bookv2ListSerializer
  • 相关阅读:
    自己动手,制作真正的.net Framework 3.5 SP1离线安装包(转)
    理解lvalue和rvalue
    Android webView 支持缩放及自适应屏幕
    微信打赏小程序寻投资或买断代码
    微信批量关注公众号,推送消息软件介绍
    QQ微信号数据库 微信号采集 可区分性别地区1-100万个
    给客户开发的 贵金属喊单视频直播间 财经直播间系统
    揭秘:各大视频网站是这样密谋秀场的
    类似YY 9158网页版多人语音视频聊天室远程教学系统源码
    WEB网页视频会议系统源码
  • 原文地址:https://www.cnblogs.com/wukai66/p/11704852.html
Copyright © 2011-2022 走看看