定义:序列化用于对用户请求数据进行验证和数据进行序列化。
基于serializers实现序列化功能
方式一: 继承serializers.Serializer
:全部自定义字段

class Userserializer(serializers.Serializer): name=serializers.CharField() pwd=serializers.CharField() group=serializers.CharField(source='group.title') class Tst(APIView): authentication_classes = [] def get(self,request,*args,**kwargs): user_list=models.UserInfo.objects.all() ser= Userserializer(instance=user_list,many=True,context={'request':request}) return Response(ser.data) 这里的字段全部自己定义,里面的group字段是跨表查询而来
方式二: 继承: serializers.ModelSerializer (常用)
可基于models自动生成字段.

class Mypassword: def __init__(self,base): self.base=base print(self.base) def __call__(self,value): print(value,'4444444444444444444444444444') if value!=self.base: raise exceptions.ValidationError('密码错误') class Regiest(serializers.ModelSerializer): class Meta: model=models.UserInfo fields='__all__' depth=1 #必须要加上,表示会通过下面多少层 extra_kwargs={ 'name':{'min_length':6}, #模块自带限制条件 'pwd':{'validators':[Mypassword('as'),]} #也可以自己重写错误信息 }
这里常用的还是serializers.ModelSerializer 和serializers.Serializer 一起作用

class Userserializer(serializers.ModelSerializer): group=serializers.CharField(source='group.title') roles=serializers.CharField(source='roles.name') x1=Groupser(source='roles.all') x2=serializers.SerializerMethodField() #钩子 x3=serializers.ListField(child=Myrole(),source='roles.all') class Meta: model=models.UserInfo # fields='__all__' fields=['group','roles','x1','x2','x3'] depth=2 def get_x2(self,obj): #1重写方式一 obj_list=obj.roles.filter(id__gt=1) s_list=[] for s in obj_list: s_list.append(s.name) return s_list class Myrole(serializers.CharField): #方式二 def to_representation(self, value): return {'id':value.id,'name':value.name} class Groupser(serializers.CharField): #方式三 def to_representation(self, value): role_list=[] for role in value: role_list.append(role.name) return role_list
方式三,生成url
serializers.HyperlinkedIdentityField

#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers from .. import models class PasswordValidator(object): def __init__(self, base): self.base = str(base) def __call__(self, value): if value != self.base: message = 'This field must be %s.' % self.base raise serializers.ValidationError(message) def set_context(self, serializer_field): """ This hook is called by the serializer instance, prior to the validation call being made. """ # 执行验证之前调用,serializer_fields是当前字段对象 pass class ModelUserSerializer(serializers.ModelSerializer): ut = serializers.HyperlinkedIdentityField(view_name='detail') class Meta: model = models.UserInfo fields = "__all__" extra_kwargs = { 'user': {'min_length': 6}, 'pwd': {'validators': [PasswordValidator(666),]}, } class TestView(APIView): def get(self, request, *args, **kwargs): # 序列化,将数据库查询字段序列化为字典 data_list = models.UserInfo.objects.all() ser = ModelUserSerializer(instance=data_list, many=True, context={'request': request}) # 或 # obj = models.UserInfo.objects.all().first() # ser = UserSerializer(instance=obj, many=False) return Response(ser.data) def post(self, request, *args, **kwargs): # 验证,对请求发来的数据进行验证 print(request.data) ser = ModelUserSerializer(data=request.data) if ser.is_valid(): print(ser.validated_data) else: print(ser.errors) return Response('POST请求,响应内容')