zoukankan      html  css  js  c++  java
  • Django Rest framework 序列化

    1 序列化入门

    class RoleSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        title = serializers.CharField()
        label = serializers.CharField()
    

    2 进阶序列化1

    class UserSerializer(serializers.Serializer):
        id = serializers.IntegerField()
        username = serializers.CharField()
        nick_name = serializers.CharField()
        password = serializers.CharField()
        state = serializers.BooleanField()
        is_super = serializers.BooleanField()
        last_login = serializers.DateTimeField()
    
        #一对一关系
        #roles = serializers.CharField(source="roles.title")
    
        # 多对多,SerializerMethodField(),表示自定义显示
        # 然后写一个自定义的方法
        roles = serializers.SerializerMethodField()
    
        def get_roles(self,row):
            role_obj = row.roles.all()
            ret = []
            for i in role_obj:
                ret.append({'id':i.id,'title':i.title})
            return ret
    

    3 进阶序列化2

    class UserSerializer(serializers.ModelSerializer):
        #一对一关系
        #roles = serializers.CharField(source="roles.title")
    
        # 多对多,SerializerMethodField(),表示自定义显示
        # 然后写一个自定义的方法
        roles = serializers.SerializerMethodField()
    
        def get_roles(self,row):
            role_obj = row.roles.all()
            ret = []
            for i in role_obj:
                ret.append({'id':i.id,'title':i.title})
            return ret
        class Meta:
            model = models.Users
            fields = ['id','username','nick_name','password','roles']
    

    4 序列化进阶3,自动序列化连表

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Users
            fields = "__all__"
            # 连表的深度
            depth = 1
    

    5 序列化进阶4,生成URL

    class UserSerializer(serializers.ModelSerializer):
        roles = serializers.HyperlinkedIdentityField(view_name='roleId',many=True,lookup_url_kwarg='id')
        class Meta:
            model = models.Users
            fields = "__all__"
            # 连表的深度
            depth = 1
    class UsersView(APIView):
        def get(self,request,*args,**kwargs):
            ret = {'code':1000,'msg':None,'data':None}
            try:
                obj = models.Users.objects.all()
                #使用HyperlinkedIdentityField生成URL,这里必须要传参数context={'request':request}
                ser = rbac_serializers.UserSerializer(instance=obj, many=True,context={'request':request})
                ret['data'] = ser.data
            except Exception as e:
                logger.error(e)
            return Response(ret)
    

      

    6 序列化进阶5,自定义验证规则

    #定义验证规则
    class GroupValidation(object): def __init__(self,base): self.base = base    #__call__(),该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用 def __call__(self, value): if not value.startswith(self.base): message = "标题必须以%s为开头"%self.base raise serializers.ValidationError(message) class UserGroupSerializer(serializers.Serializer):
       #序列化中加入字段校验 title = serializers.CharField(validators=[GroupValidation('以我开头'),]) class UserGroupView(APIView): def post(self,request,*args, **kwargs): ser = UserGroupSerializer(data=request.data) if ser.is_valid(): print(ser.validated_data['title']) else: print(ser.errors) return HttpResponse("用户提交数据验证")

      

  • 相关阅读:
    正则表达式
    模块初阶
    面向对象的一些理论表述,涉及知识的理解和内置方法
    面向对象的反射 和 特殊内置方法
    面向对象的属性,类方法.静态变量
    面向对象的 多态,
    面向对象的继承属性
    面向对象组合思想的经典题
    面向对象,类名称空间查找顺序 和组合
    jQuery对象与DOM对象之间的转换
  • 原文地址:https://www.cnblogs.com/xiao2er/p/13292036.html
Copyright © 2011-2022 走看看