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