1.序列化常用字段参数
'''1. 选项参数'''
name = serializers.CharField(min_length=3,max_length=20)
max_length # 最大长度
min_lenght # 最小长度
allow_blank # 是否允许为空
max_value # 最大值
min_value # 最小值
'''2. 通用参数'''
gp = serializers.SerializerMethodField(read_only=True)
read_only # 表明该字段仅用于序列化输出,默认False
write_only # 表明该字段仅用于反序列化输入,默认False
required # 表明该字段在反序列化时必须输入,默认True
default # 反序列化时使用的默认值
allow_null # 表明该字段是否允许传入None,默认False
validators # 该字段使用的验证器
label # 用于HTML展示API页面时,显示的字段名称
help_text # 用于HTML展示API页面时,显示的字段帮助提示信息
error_messages # 包含错误编号与错误信息的字典
2.序列化(serializers.Serializer
)
1)序列化(正向查找)`
from rest_framework import serializers
from users.models import UserInfo
class UserInfoSerializer(serializers.Serializer):
name = serializers.CharField(min_length=3,max_length=20)
ut = serializers.CharField(source='ut.type_name',required=False)
gp = serializers.SerializerMethodField(read_only=True)
xxx = serializers.CharField(source='name',required=False)
ut_id = serializers.IntegerField(write_only=True)
'''PrimaryKeyRelatedField和StringRelatedField:可以用对 一对多 和 多对多 关联对象序列化'''
class Meta:
model = UserInfo
def get_gp(self,row):
'''row: 传过来的正是 UserInfo表的对象'''
gp_obj_list = row.gp.all().values('id','group')
return gp_obj_list
2)序列化(反向查找)
''' 一对多序列化(反向查找)'''
class UserTypeSerializer(serializers.Serializer):
type_name = serializers.CharField()
userinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
3)视图函数中使用序列化
class UserInfoViewSet(APIView):
def get(self, request, *args, **kwargs):
obj = users_model.UserInfo.objects.all()
ser = serializers.UserInfoSerializer(instance=obj,many=True)
return Response(ser.data, status=200)
3、反序列化
1)使用反序列化保存数据
'''创建用户'''
def post(self,request):
ser = serializers.UserInfoSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response(data=ser.data, status=201)
return Response(data=ser.errors,status=400)
2)反序列化定义创建和更新方法
def create(self, validated_data):
return UserInfo.objects.create(**validated_data)
def update(self, instance, validated_data):
if validated_data.get('name'):
instance.name = validated_data['name']
if validated_data.get('ut_id'):
instance.ut_id = validated_data['ut_id']
instance.save()
return instance
def validate_name(self, value):
if value == 'root':
raise serializers.ValidationError('不能创建root管理员账号')
return value
def validate(self, attrs):
if attrs['name'] == 'admin':
raise serializers.ValidationError('不能创建admin用户')
return attrs
4、序列化使用举例(serializers.ModelSerializer
)
-
ModelSerializer本质是继承了Serielizer类添加了部分功能
-
在使用上ModelSerializer可以使用 fields = '__all__' 定义要显示的字段
serializers.ModelSerializer
使用
'''users/serializers/userinfo_serializers.py'''
from rest_framework import serializers
from users.models import UserInfo
class UserInfoSerializer(serializers.ModelSerializer):
ut = serializers.CharField(source='ut.type_name')
gp = serializers.SerializerMethodField()
xxx = serializers.CharField(source='name')
class Meta:
model = UserInfo
fields = ["name",'ut','gp','xxx']
def get_gp(self,row):
'''row: 传过来的正是 UserInfo表的对象'''
gp_obj_list = row.gp.all()
ret = []
for item in gp_obj_list:
ret.append({'id':item.id,'gp':item.group})
return ret
5、使用serializers.ModelSerializer
进行数据验证
1.users/views.py
from rest_framework.views import APIView
from users.serializers.userinfo_serializers import UserInfoSerializer
from users.models import UserInfo
class UserInfoViewSet(APIView):
def get(self, request, *args, **kwargs):
obj = UserInfo.objects.all()
ser = UserInfoSerializer(instance=obj,many=True)
ret = json.dumps(ser.data,ensure_ascii=False)
return HttpResponse(ret)
def post(self, request, *args, **kwargs):
ser = UserInfoSerializer(data=request.data)
if ser.is_valid():
print(ser.validated_data)
else:
print(ser.errors)
return HttpResponse(json.dumps({'status':True}))
2.users/serializers/userinfo_serializers.py
'''1、ser.is_valid()'''
'''2、全局校验钩子'''
def validate(self, value):
'''3、局部钩子'''
def validate_name(self, value):