rest-framework序列化

定义:序列化用于对用户请求数据进行验证和数据进行序列化。

基于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字段是跨表查询而来
Views代码

方式二: 继承:   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'),]} #也可以自己重写错误信息
        }
单纯用Serializer模块

这里常用的还是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
2中方式结合

方式三,生成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请求,响应内容')
生成url
原文地址:https://www.cnblogs.com/52forjie/p/8490978.html