码迷,mamicode.com
首页 > 其他好文 > 详细

put请求(单整体改),patch请求(群单改,群改)

时间:2019-10-19 21:00:21      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:操作   字段   child   转换   enumerate   one   object   数据   meta   

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

 

put请求(单整体改),patch请求(群单改,群改)

标签:操作   字段   child   转换   enumerate   one   object   数据   meta   

原文地址:https://www.cnblogs.com/wukai66/p/11704852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!