zoukankan      html  css  js  c++  java
  • drf框架serializers中ModelSerializer类简化序列化和反序列化操作

    0905自我总结

    drf框架serializers中ModelSerializer类

    基于seriallizer类进行简化

    https://www.cnblogs.com/pythonywy/p/11455508.html

    一.简单的使用

    导入from rest_framework import serializers

    与基础serializer类后续使用的作用相似

    class 自定义名称(serializers.ModelSerializer):
        class Meta:
            model=对应的模型
            fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
            #fields='__all__'  为所有字段
            # exclude = ('id', 'is_delete')  # 刨除某些字段
            # depth = 1  # 跨表自动深度(展示外键表的所有字段)
    

    注意点

    • 其中fieldsexclude不能共存
    • depth不能控制显示字段,与外键相关的表会全部显示出来

    二.利用模型类中的方法进行指导字典的生成

    例如有两个模型AB,他们的c字段有外键关联

    modles.py

    class B(models.Model):
        name = models.CharField(max_length=60)
        
    class A(models.Model):
        uid = models.ForeignKey(B,'id')
        
        @property    #下面调用函数名的时候自动运行函数
        def b_name(self):  #这里的self是A类
            return self.uid.name
            
    class AModelSerializer(serializers.ModelSerializer):
            class Meta:
            	model=A   #这里导入A会把A里面的所有名称空间存在的都进行导入
                fields=('b_name')
    

    三.另外总方法完成深度查询

    class B(models.Model):
        name = models.CharField(max_length=60)
        
    class A(models.Model):
        uid = models.ForeignKey(B,'id')
    
    #方法一
    class BModelSerializer(serializers.ModelSerializer):
            class Meta:
            	model=B   
                fields=('b_name')
     
    class BModelSerializer(serializers.ModelSerializer):
         	b_name = BModelSerializer()
            class Meta:
            	model=A   #这里导入A会把A里面的所有名称空间存在的都进行导入
                fields=('b_name')
                
    #方法二
    #通过自定义字段
    class BModelSerializer(serializers.ModelSerializer):
         	  b_name = serializers.SerializerMethodField()
       		  def get_b_name(self, obj: models.A):
                   return A.uid.name
            class Meta:
            	model=A   #这里导入A会把A里面的所有名称空间存在的都进行导入
                fields=('b_name')
    

    四.ModelSerializer对于反序列话约数条件设置及只读只写属性设置

    反序列话约数条件设置

    class 自定义名称(serializers.ModelSerializer):
        class Meta:
            model=对应的模型
            fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
            extra_kwargs ={
                参与序列化和反序列的字段1:{
                    'required': True,  #必须填写的字段
                     'min_length': 3,
                    #.....约数条件
                    'error_messages': {
                        'min_length': '太短'
                       
                    }
                }
            }
    

    只读只写属性设置

    class 自定义名称(serializers.ModelSerializer):
        class Meta:
            model=对应的模型
            fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
            extra_kwargs ={
                参与序列化和反序列的字段1:{
    				 'write_only': True #只写
                }
            	参与序列化和反序列的字段2:{
    				 'read_only': True #只读
                }
            }
    

    五.视图层使用

    数据没有修改

    class BookAPIView(APIView):    
        def get(self, request, *args, **kwargs):
            book_query = models.Book.objects.all()  #假设查我们定义的书的这个模型
            book_ser = serializers.BookModelSerializer(book_query, many=True)
            return Response(0, 'ok', results=book_ser.data) #用drf框架自带的Response
    

    有添加修改相关操作

    class BookAPIView(APIView):    
        def post(self, request, *args, **kwargs):
            pk=kwargs.get('pk')
            book_obj = models.Book.objects.get('pk')
            book_ser = serializers.BookModelSerializer(instance=book_obj,data=request.data) #根据传进来的数据机芯判断
            #如果多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true)
            if book_ser.is_valid():  #这里是我们设置的ModelSerializer的约数条件看是否能通过
                book_ser.save()  #这里他会自动进行判断是create方法还是update方法
                return Response(0, 'ok',results=book_ser.data)
            else:
                return Response(1, '添加失败', results=book_ser.errors)#用drf框架自带的Response
    
    • 注意点:save源码中我们可以看到instance有值调用updata方法,没有值调用create方法.所以修改必须加instance参数,传的参数基本上是修改之前的对象

    有关删除

    class BookAPIView(APIView):    
        def post(self, request, *args, **kwargs):
            book_ser = serializers.BookModelSerializer(data=request.data) #根据传进来的数据机芯判断
            #如果多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true)
            if book_ser.is_valid():  #这里是我们设置的ModelSerializer的约数条件看是否能通过
                book_ser.deleter()  #这里他会自动进行判断是create方法还是update方法
                return Response(0, 'ok',results=book_ser.data)
            else:
                return Response(1, '删除失败', results=book_ser.errors)#用drf框架自带的Response
    
  • 相关阅读:
    (原创) mac 10.9.2 eclipse 的 CDT 的 异常的修复
    (转) Virtual function
    (转) ROS NAMING AND NAMESPACES
    (转) Data structures
    (转) Dynamic memory
    java string类
    eclipse 的快捷键
    java抽象类和接口
    面向对象的三大特征
    Java 中的多态
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11469449.html
Copyright © 2011-2022 走看看