• 重写序列化组件


    from rest_framework.serializers import ModelSerializer
    from api import models
    from rest_framework import serializers
    from django.contrib.auth import authenticate
    from utils import TokenIssue
    class LoginModelSerializer(ModelSerializer):
        - 必须使用自定义的字段, 如果使用的是默认的字段,drf会自动验证,就没办法进来我们的序列化组件
        custom_user = serializers.CharField(write_only=True)
        custom_pwd = serializers.CharField(write_only=True)
    
        class Meta:
            - 指定表
            model = models.User
            - 指定序列化与反序列化字段
            fields = ('custom_user', 'custom_pwd')
            - 可以配置返回的不符合条件的报错信息,以及设置只能序列化或者反序列化
            extra_kwargs = {
                字段名: {
                    配置
                }
            }      
    
        # 定义全局钩子
        def validate(self, attrs):
            - attrs 中传递过来的是用户名和密码,
            - 使用auth模块验证传递过来的用户名和密码是否正确
            custom_user = attrs.get("custom_user")
            custom_pwd = attrs.get("custom_pwd")
            print(custom_user, custom_pwd)
            user_obj = authenticate(username=custom_user, password=custom_pwd)
            if not user_obj: # 如果用户不存在
                raise serializers.ValidationError({'user error': '用户信息错误'})
            - 如果用户存在
            - token签发算法
            - 将用户对象和token保存到self的扩展名称空间中
            self.user = user_obj
            - 调用自定义token加密解密算法生成我们的token
            token_obj = TokenIssue.Token_Issue()
            token = token_obj.get_token(user_obj)
            self.token = token
    
            return attrs
        def validate_username(self, value)
            ...
            return value
    

    接口如何使用

    -- 反序列化: 把前台的数据传递
    
    - 单增
    ser = serializers.LoginModelSerializer(data=request.data)
    - 多增
    ser = serializers.LoginModelSerializer(data=request.data, many=True)
    - 局部改(partial=True: 允许局部修改)
    ser = serializers.LoginModelSerializer(instance=原数据, data=传过来要修改的数据, partial=True)
    - 整体改
    ser = serializers.LoginModelSerializer(instance=原数据, data=传过来要修改的数据)
    
    - 序列化
    ser = serializers.LoginModelSerializer(数据库查出来的obj).data - obj要是model指定表的obj
    
    instance: 原数据
    data: 传递过来的修改的数据
    partial: 是否允许局部修改
    many: 是否是多个数据操作
    
  • 相关阅读:
    telnet c# 执行命令
    C# Windows服务安装、卸载批处理代码
    数据库高人 邹健 博客链接
    HDOJ_1232 并查集 畅通工程
    poj3461 KMP 小结
    HDOJ_2094 寻找冠军 set的简单应用
    HDOJ_1272 小希的迷宫 并查
    HDOJ_2754 素数种类统计
    linux下的jsp
    mysql
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11931118.html
Copyright © 2020-2023  润新知