• ModelSerializer类序列操作


    ModelSerializer类序列化

    mysql配置:

    #settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'drf_jp',
            'USER': 'root',
            'PASSWORD': '155345',
            'CHARSET': 'utf8',
        }
    }
    
    # 配置 mysql 代替 : mongdb  (可用于各个app)
    import pymysql
    pymysql.install_as_MySQLdb()
    
    
    

    单表序列化与反序列化操作:

    
    ModelSerializer类序列化与反序列化总结:
            
    1)序列化类继承ModelSerializer,所以需要在配置类Meta中进行配置
    2)model配置:绑定序列化相关的Model表
    3)fields配置:采用 插拔式 设置所有参与序列化与反序列化字段
    4)extra_kwargs配置:
        划分系统字段为三种:只读(read_only)、只写(write_only)、可读可写(不设置)
        字段是否必须:required
        选填字段:在extra_kwargs进行配置,但不设置required,且有默认值
    5)自定义序列化字段:
        第一种(不提倡):在序列化类中用SerializerMethodField()来实现
        第二种(提倡):在模型类中用@property来实现,可插拔
    6)自定义反序列化字段:
        同Serializer类,且规则只能在此声明中设置,或是在钩子中设置,在extra_kwargs中对其设置的无效
        自定义反序列化字段与系统字段,设置规则一样,所以必须设置 write_only
    7)局部钩子,全局钩子同Serializer类
    8)不需要重写create和update方法
    

    ModelSerializer类序列化与反序列化:

    反序列化中增加了条件的筛选:
    
    1.类的字段值应用在反序列化,我们可以在他的字段的属性上加上write_only=True
    
    2raise serializers.ValidationError('异常信息') #抛出异常
    
    3.attrs是所有字段的一个类似字典的集合
    
    4.user_ser.is_valid():  # 自定义处理校验成功的逻辑
        
    5.user_ser.errors : #自定义返回错误信息
     
    class 自定义名称(serializers.ModelSerializer):
        class Meta:
            model=对应的模型
            fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
            #fields='__all__'  为所有字段
            # exclude = ('id', 'is_delete')  # 刨除某些字段
            # depth = 1  # 跨表自动深度(展示外键表的所有字段)   
    
    注意:
        fields与exclude不能共存
        depth不能控制显示字段,与外键相关的表会全部显示出	
    

    put 更新:

     # 更新一个资源
        def put(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            old_user_query = User.objects.filter(pk=pk, is_delete=False)
            # 没有数据
            if not old_user_query:
                return Response({
                    'status': 1,
                    'msg': 'update failed',
                })
    
            user_deser = UserSerializer(instance=old_user_query, data=request.data)
            result = user_deser.is_valid()
            if result:
                new_user_query = user_deser.save()
                new_user_obj = new_user_query.first()
                return Response({
                    'status': 0,
                    'msg': 'success',
                    'result': UserSerializer(new_user_obj).data
                })
            else:
                return Response({
                    'status': 1,
                    'msg': 'failed',
                    'results': user_deser.errors
                })
    

    post 新增:

    
    # 新增一个资源
        def post(self, request, *args, **kwargs):
            user_deser = UserSerializer(data=request.data)
    
            # raise_exception值为True,当校验失败,直接返回校验失败的错误信息
            # result = user_deser.is_valid(raise_exception=True)
            result = user_deser.is_valid()
            if result:
                new_user_obj = user_deser.save()
                return Response({
                    'status': 0,
                    'msg': 'success',
                    'result': UserSerializer(new_user_obj).data
                })
            else:
                return Response({
                    'status': 1,
                    'msg': 'failed',
                    'results': user_deser.errors
                })
    
    

    单删:

    
    现在数据都是很重要的一般情况下不会吧数据删除只会做个标记字段其本质还是局部更新
    
        def delete(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            if not pk:
                return APIResponse(1, 'pk error')
            user_obj = models.User.objects.filter(pk=pk, is_delete=False).first()
            if not user_obj:
                return APIResponse(1, '删除失败')
            user_obj.is_delete = True
            user_obj.save()
            return APIResponse(0, '删除成功')
    
  • 相关阅读:
    博客圆终于注册完成了
    C# DES加密解密算法(让DES算法支持任意长度字符串作密钥)
    XNA开发思考之(1)tank的移动
    《Java基础知识》Java变量的声明、初始化和作用域
    《Java基础知识》Java 运算符
    《Java基础知识》Java常量的申明和使用
    《Java基础知识》Java字符串详解
    《Java基础知识》Java流程控制
    《Java基础知识》Java一维,二维数组的申明和使用
    删除数据库所有表的数据
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12099565.html
Copyright © 2020-2023  润新知