zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Entity Framework 连接低版本数据库
    Validate Disk Failover Failed
    Unable to create Azure Mobile Service: Error 500
    查看Visual Studio异常内容
    RDLC An unexpected error occurred while compiling expressions. Native compiler return value: '-1073741511'
    Redis 64 steps
    IQueryable join 的问题
    jquery 通知页面变化
    jquery 让滚动条处于div底部
    SSIS 文件系统任务无法使用变量配置目标路径
  • 原文地址:https://www.cnblogs.com/52forjie/p/8490978.html
Copyright © 2011-2022 走看看