serializer组件(代码片段)

bjlxxbj bjlxxbj     2023-05-05     279

关键词:

Serializer组件(序列化器-Serializer)

1.定义序列化器

Django REST framework中的Serializer使用类来定义, 需要继承自rest_framework.serializers.Serializer.

1.# 先定义数据库模型类User
from django.db import models

class User(models.Model):
    CHOICES_SEX = ((0, '男'), (1, '女'))
    name = models.CharField(max_length=64)
    age = models.IntegerField(default=0)
    height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    icon = models.ImageField(upload_to='icon', default='default.png')
    sex = models.IntegerField(choices=CHOICES_SEX, default=0)
    # 已经迁移的数据库,新增字段需要允许为空或者设置默认值
    pwd = models.CharField(max_length=64, null=True)



    # 自定义插拔序列化字段:替换了在Serializer类中自定义的序列化字段(SerializerMethodField)
    # 自定义插拔序列化字段一定不参与反序列化过程
    @property
    def gender(self):
        return self.get_sex_display()


    class Meta:
        db_table = 'ob_user'  # 规定我的表名
        verbose_name = '用户表'  # 规定在管理用户下的名字
        verbose_name_plural = verbose_name  # 规定模型名称.

    def __str__(self):
        return self.name
2.新建一个serializers.py文件
序列化
from ret_framework import serializers
class UserSerializer(serializers.Serializer):  # 需要继承serializers.Serializer
    # model 已有的属性字段
    # 如果要参与序列化,名字一定要与midel的属性同名
    # 如果不参与序列化的model属性,在序列化类中不做声明.
    name = serializers.CharField()
    age = serializers.IntegerField()
    height = serializers.DecimalField(max_digits=5, decimal_places=2)
    
    # 自定义序列化字段,序列化的属性值由方法来提供,
    # 方法的名字: 固定为 get_属性名.
    # 方法的参数: 序列化对象, 序列化的model对象
    # 自定义序列化字段名不要与model已有的属性名重名.
    
    gender = serializers.SerializerMethodField()
    def get_gender(self, obj):
        return obj.get_sex_display()
        
# 反序列化
from . import models
class userDeserializer(serializers.Serializer):
    # 系统校验规则
    # 系统必须反序列化的字段
    # 序列化属性名不是必须与model属性名对应,但是与之对应会方便序列化将校验通过的数据与数据库进行交互.
    
    name = serializers.CharField(min_length=3, max_length=6, error_messages=
        'required': '姓名必填',
        'min_length': '太短', # 重新定义错误信息
    )
    pwd = serializers.CharField(min_length=3, max_length=64)
    
    # 系统可选的反序列化字段: 没有提供不进行校验(数据库中有默认值或可以为空),提供了就进行校验
    age = serializers.IntegerField(min_value=0, max_value=150, required=False)
    
    # 自定义反序列化字段: 一定参与校验,且要在校验过程中,将其从入库的数据中取出,与model对应的数据才会入库
    re_pwd = serializers.CharField(min_length=3, max_length=64)
    
    # 自定义校验规则: 局部钩子, 全局钩子
    # 局部钩子: validata_字段名(self, 字段名)
    # 规则: 成功返回value, 失败抛异常.
    def validate_name(self, value):
        if 'k' in value.lower():
            raise serializers.ValidationError('名字中不能有k')
        return value
        
    # 全局钩子
    # 规则: 成功返回attrs, 失败抛异常
    def validate(self, attrs):
        # 取出联合校验地字段们: 需要入库的值需要拿到值, 不需要入库的需要从校验字段中取出.
        pwd = attrs.get('pwd')
        re_pwd = attr.pop('re_pwd')
        if pwd != re_pwd:
            raise serializers.ValidationError('re_pwd': '两次密码不一致')
        return attrs
    
    # create重写, 完成入库
    def create(self, validated_data):
        return models.User.objects.create(**validated_data)

序列化

一.视图类的三步操作
1.ORM操作数据库拿到资源数据
2.格式化(序列化)成能返回给前端的数据
3.返回格式化后的数据

二.视图类的序列化操作
1.直接将要序列化的数据传给序列化类
2.要序列化的数据如果是单个对象,序列化参数many为False, 数据如果是多个呢many为True

三.序列化类
1.model类中要反馈给前台的字段, 在序列化类中要进行声明,属性名必须就是model的字段名,且Field类型保持一致
2.model类中不需要犯规给前台的字段,在序列化类中不要声明
3.自定义序列化字段用SerializerMethodField() 作为字段类型,该字段的值来源于 get_自定义字段名(self, obj) 方法的返回值

反序列化

一.视图类的三步操作
1.从请求对象中拿到前台的数据
2.校验前台的数据是否合法
3.反序列化后台model对象与数据库交互

二.视图类的反序列化操作
1.将要反序列化的数据传给序列化类的data参数
2.要反序列化的数据是单个字典,反序列化参数many为False, 数据如果是多个字典的列表,参数many为True

三.反序列化类
1.系统的字段,可以在Field类型中设置系统校验规则(name=serializers.CharField(min_length=3))
2.required校验规则绝对该字段是必校验还是可选校验字段(默认required为True,数据库字段有默认值或可以为空的字段required可以赋值为False)
3.自定义的反序列字段,设置系统校验规则同系统字段,但是需要在自定义校验规则中(局部、全局钩子)将自定义反序列化字段取出(返回剩余的数据与数据库交互)
4.局部钩子的方法命名 validate_属性名(self, 属性的value),校验规则为 成功返回属性的value 失败抛出校验错误的异常
5.全局钩子的方法命名 validate(self, 所有属性attrs),校验规则为 成功返回attrs 失败抛出校验错误的异常

2.ModelSerializer

from rest_framework.serializers import ModelSerializer
from . import models
from rest_framework import serializers

# 整合序列化和反序列化
class UserModelSerializer(ModelSerializer):
    # 1.将序列化类与Model类进行绑定
    # 2.设置序列化与反序列化所有字段(并划分序列化字段与反序列化字段)
    # 3.设置反序列化的局部与全局钩子

    # 自定义反序列化字段
    re_pwd = serializers.CharField(min_length=3, max_length=64, write_only=True)

    class Meta:
        model = models.User  # 1.进行绑定
        fields = ['name', 'age', 'height', 'pwd', 're_pwd']  # 设置所有字段
        extra_kwargs = 
            'name': 
                'required': True,  # 表示必须有值
                'min_length': 3,
                'error_messages': 
                    'min_length': '太短了'  # 你可以在这里面重写字段的信息.
                

            ,
            'age': 
                'required': True,  # 数据库有默认值或可以为空字段
                'min_value': 0
            ,
            'pwd': 
                'required': True,
                'write_only': True,  # 这里的意思是只参与反序列化
            ,
            'gender': 
                'read_only':True,  # 只参与序列化
            ,
        
        # 局部钩子
        def validate_name(self, value):  # 判断名字中有k就直接抛错
            if 'k' in value.lower():
                raise serializers.ValidationError('名字中不能有k')
            return value

        # 全局钩子
        def validate(self, attrs):
            pwd = attrs.get('pwd')
            re_pwd = attrs.pop('re_pwd')  # 通过pop拿到二次密码,因为二次密码不用进行保存
            if pwd != re_pwd:
                raise serializers.ValidationError('re_pwd': '两次密码不一致')

单表序列化总结

1.序列化与反序列功能可以合成一个类, 该类继承ModelSerializer
2.继承ModelSerializer类的资源序列化类, 内部包含三个部分
    Meta子类, 局部钩子, 全局钩子
    注:create和update方法ModelSerializer已经重写了, 使用不要重新写了
3.在Meta子类中规定
    用model来绑定关联的Models类
    用fields来设置所有的序列化反序列化字段
    用extra_kwargs来设置系统校验规则
4.重要的字段规则
    read_only校验规则,代表该字段只参与序列化
    write_only校验规则,代表该字段只参与反序列化
    required校验规则, 代表该字段在反序列化是否是必填(Trur)还是选填(False), 不能和read_only一起使用
    规则细节:
        如果一个字段有默认值或是可以为空,没设置required规则,默认为False,反之默认值为True
        如果一个Model字段即没有设置read_only也没设置write_only,该字段默认参与序列化及反序列化
5.自定义序列化字段: 在Model类中,定义方法属性(可以返回特殊值,还可以完成联表操作),在序列化类的fields属性可以选择性插拔
6.自定义反序列化字段: 在Serializers类中,自定义校验字段,校验规则也只能在声明字段时设置,自定义的反序列化字段(如re_pwd),
必须设置write_only为True

drf框架之serializers序列化组件(代码片段)

...,就是吧信息存为类字典形式2.DRF框架自带序列化的工具:serializers 3.DRF框架serializers分为:第一种Serializer 第二种ModelSerializer 第一种用法之Serializerfromdjango.dbimportmodels#Createyourmod 查看详情

serializer组件(代码片段)

Serializer组件(序列化器-Serializer)1.定义序列化器DjangoRESTframework中的Serializer使用类来定义,需要继承自rest_framework.serializers.Serializer.1.#先定义数据库模型类Userfromdjango.dbimportmodelsclassUser(models.Model):CHOICES_SEX=((0,'男'),(1,'女'))... 查看详情

序列化组件(代码片段)

一、django自带的序列化组件Django内置的serializers(把对象序列化成json字符串)fromdjango.coreimportserializersdeftest(request):book_list=Book.objects.all()ret=serializers.serialize("json",book_list)returnHttpResponse(ret)二、res 查看详情

serializers序列化组件(代码片段)

为什么要用序列化组件当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式。那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化。接... 查看详情

serializer组件(代码片段)

Serializer组件一、序列化器-Serializer作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据... 查看详情

serializers序列化组件(代码片段)

 为什么要用序列化组件当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式。那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化... 查看详情

restfull02序列化组件(代码片段)

RESTFULLL序列化组件一、Django自带序列化组件?内置的serializers(把对象序列化成json字符串)(一般不用)fromdjango.coreimportserializersdeftest(request):book_list=Book.objects.all()ret=serializers.serialize("json",book_list)retu 查看详情

$django序列化组件(代码片段)

1序列化组件fromapp01importmodelsfromrest_frameworkimportserializersfromrest_framework.serializersimportSerializer,ModelSerializerfromdjango.httpimportJsonResponseclassauth(Serializer):name=serializers.Char 查看详情

modelserializer组件(代码片段)

ModelSerializer组件一、DRF模型类序列化器如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。ModelSerializer与常规的Serializer相同,但提供了:基于模型... 查看详情

drf序列化组件(代码片段)

目录1一序列化器-Serializer1.1定义序列化器1.2创建Serializer对象1.3序列化器的使用1.3.1序列化1.3.1.1基本使用1.3.1.2高级用法source和serializers.SerializerMethodField()的用法1.3.2反序列化1.3.2.1数据验证1)validate_字段名2)validate3)validators1.3.2.2反序... 查看详情

vue组件间传值(代码片段)

1、通过路由传值A组件通过params把参数传递给B组件(触发事件可以是点击事件、钩子函数)letparams=amount:item.amount,//金额payment:item.payment,//交易方式code:item.code,//商家代码serial_num:item.serial_num,//流水号this.$router.push(path:‘/income/detail 查看详情

序列化组件的使用(代码片段)

...器DjangoRESTframework中的序列化器,需要继承于rest_framework.serializer.Serializer序列化 查看详情

drf序列化组件(代码片段)

rest_framework序列化之Serializer步骤:1.自定义一个类,继承Serializer类;2.在类中写要序列化的字段;3.使用:在views.py文件中,book_ser=BookSerializer(book_list,many=True),book_ser.data就是序列化后的数据。当序列化的数据有多条(为QuerySet对... 查看详情

serializers序列化组件(代码片段)

为什么要用序列化组件当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式。那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到的数据进行序列化。接... 查看详情

drf序列化组件(代码片段)

目录在视图中手动完成序列化操作Serializer序列化Serializer序列化总结:Serializer反序列化Serializer反序列化总结:ModelSerializer序列化与反序列化ModelSerializer序列化与反序列化总结:在视图中手动完成序列化操作#view.pyclassUserV1ApiView(AP... 查看详情

drf之序列化组件(代码片段)

1一序列化器-Serializer作用:1.序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串2.反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型3.反序列化,完成数据校验功能1.1定... 查看详情

权限组件(代码片段)

...ssion_classes=[IsAuthenticatedOrReadOnly]queryset=models.Book.objects.all()serializer_class=serializers.BookSerializer权限组件项 查看详情

序列化组件(代码片段)

 序列化组件把后端的数据对象序列化成json格式的字符串传到前端一 Django内置的serializers(把对象序列化成json字符串)fromdjango.coreimportserializersfromdjango.coreimportserializersdeftest(request):book_list=Book.objects.all()ret=seriali 查看详情