• drf 整体单改 局部单改 局部群改


    整体单改

      单整体改,说明前台要提供修改的数据,那么数据就需要校验,校验的数据应该在实例化“序列化类对象”时,赋值给data, 修改,就必须明确被修改的模型类对象,并在实例化“序列化类对象”时,赋值给instance,  整体修改,所有校验规则有required=True的字段,都必须提供,因为在实例化“序列化类对象”时,参数partial默认为False. 

      如果partial值设置为True,就是可以局部改,partial设置True的本质就是使字段 required=True 校验规则失效

    单整体修改,一般用put请求:

      V2BookModelSerializer(
          instance=要被更新的对象,
          data=用来更新的数据,
          partial=默认False,必须的字段全部参与校验
      )

    单局部修改,一般用patch请求:
      V2BookModelSerializer(
          instance=要被更新的对象,
          data=用来更新的数据,
          partial=设置True,必须的字段都变为选填字段
      )

    class V2Book(APIView):    
         # 单整体改: 对 v2/books/(pk)/ 传的数据是与model对应的字典{name|price|publish|authors}
        def put(self, request, *args, **kwargs):
            request_data = request.data
            pk = kwargs.get('pk')
            old_book_obj = models.Book.objects.filter(pk=pk).first()
         # 将众多数据的检验交给序列化类来处理,让序列化扮演反序列化处理, 校验成功后,序列化类帮你入库 book_ser
    = serializers.V2BookModelSerializer(instance=old_book_obj,data=request_data,partial=False) book_ser.is_valid(raise_exception=True) book_obj = book_ser.save() return Response({ 'status':0, 'msg':'ok', 'results':serializers.V2BookModelSerializer(book_obj).data })

    单个与整体局部修改

    序列化层:serializers.py

    from rest_framework.serializers import ModelSerializer,SerializerMethodField,ListSerializer
    class V2BookListSerializer(ListSerializer):
        def update(self, instance, validated_data):
            print(instance)  # 要更新的对象们
            print(validated_data)   # 更新的对象对应的数据们
            print(self.child)   # 服务的模型序列化类
            for index,obj in enumerate(instance):
                self.child.update(obj,validated_data[index])
            return instance    

    视图层:views.py

    class V2Book(APIView):
      # 单局部改: 对v2/books/(pk)传的数据,数据字段key是选填
      # 群局部改: 对v2/books/ def patch(self, request,
    *args, **kwargs): request_data = request.data
         pk = kwargs.get('pk')
        # 将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据]
    if pk and isinstance(request_data,dict): # 单改 pks = [pk, ] request_data = [request_data, ] elif not pk and isinstance(request_data,list): # 群改 pks = [] for dic in request_data: pk = dic.pop('pk',None) if pk: pks.append(pk) else: return Response({ 'status': 1, 'msg': '数据有误' }) else: return Response({ 'status': 1, 'msg': '数据有误' })
        pks与request_data数据筛选,将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除,将合理的pks转换为 objs objs
    = [] new_request_data = [] for index,pk in enumerate(pks): try: obj = models.Book.objects.get(pk=pk) objs.append(obj) new_request_data.append(request_data[index]) except: continue book_ser = serializers.V2BookModelSerializer(instance=objs, 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': 'ok', 'results': serializers.V2BookModelSerializer(book_objs,many=True).data })
    dayehui
  • 相关阅读:
    bootstrap 超大屏幕(Jumbotron)
    Bootstrap历练实例:激活导航状态
    Bootstrap 徽章(Badges)
    Bootstrap历练实例:标签修饰
    Bootstrap 标签
    bootstrap 翻页的状态
    [uiautomator篇][10] uiautomator进阶
    [adb 学习篇] adb pull
    安装adb工包
    [python IO学习篇] 补充中文编码
  • 原文地址:https://www.cnblogs.com/zrh-960906/p/11708514.html
Copyright © 2020-2023  润新知