重写序列化组件

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: 是否是多个数据操作

猜你喜欢

转载自www.cnblogs.com/xiongchao0823/p/11931118.html