Serializer和ModelSerializer

序列化和反序列化

序列化:指将复杂的QuerySet和Model类型转换成Python基本数据类型,从而将这些基本数据类型以JSON的形式响应给客户端

反序列化:将Http请求中传入的JSON数据转换成复杂的数据类型,从而保存在数据库中。

在REST Framework中,提供了多个用于序列化操作的类,但常用的也就如下两个:

  • Serializer:进行序列化基本的类;

  • ModelSerializer:继承于Serializer,内部实现了通用的序列化逻辑,其中包含了与Model字段对应的字段,可以快速对Model进行序列化。

Serializer

如何对一个Model进行序列化操作

已知的model:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=40)
    age = models.IntegerField()
    number = models.IntegerField(unique=True)
    date = models.DateField()

在app/下创建serializer.py文件:

from rest_framework import serializers
from .models import Student

class StudentSerializer(serializers.Serializer):
    # 定义要序列化的字段
    name = serializers.CharField(read_only=True)
    age = serializers.IntegerField(read_only=True)
    number = serializers.IntegerField(read_only=True)
    date = serializers.DateField(read_only=True)

    # 在反序列化时,当save()调用时生成一个Student对象
    def create(self, validated_data):
        # 会将生成的实例保存到数据库
        return Student.objects.create(**validated_data)

    # 在反序列化时,当save()调用时更新Student对象
    def update(self, instance, validated_data):

        instance.name = validated_data.get('name', instance.name)
        instance.age = validated_data.get('age', instance.age)
        instance.number = validated_data.get('number', instance.number)
        instance.date = validated_data.get('date', instance.date)
        instance.save()  #确保保存在数据库
        return instance

这个序列化类中有两部分:

1.定义了要进行序列化的字段;这些字段负责将Python类型转换成JSON类型,即序列化的过程;

2.定义了当serializer.save()时用于生成Model对象的create()和update()方法,这两方法负责将JSON类型的数据转换成Python类型的数据,即反序列化的过程。

常用的Field

https://blog.csdn.net/FightFightFight/article/details/80059024

在定义Model时,我们通过models.<FieldName>获取了各种不同的字段,作为数据库中表的一个列。而在Serializer中,也需要通过`serializers.<FieldName>的形式获取对应Model的字段,用来在JSON数据和Python数据类型之间进行转换,此外还可以根据Field中传入的属性进行校验、设置默认值。

1.CharField

对应models.CharField,同时如果指定长度,还会负责校验文本长度。max_length:最大长度;min_length:最小长度;allow_blank=True:表示允许将空串做为有效值,默认False;

2.EmailField

对应models.EmailField,验证是否是有效email地址。

3.IntegerField

对应models.IntegerField,代表整数类型

4.FloatField

对应models.FloatField,代表浮点数类型

5.DateTimeField

对应models.DateTimeField,代表时间和日期类型。format='YYYY-MM-DD hh:mm':指定datetime输出格式,默认为DATETIME_FORMAT值。 serializers.Field中的公共参数

 

Serializer的方法和属性

1.save()

在调用serializer.save()时,会创建或者更新一个Model实例(调用create()或update()创建),具体根据序列化类的实现而定

# .save() will create a new instance.
serializer = StudentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = StudentSerializer(comment, data=data)

2.create()、update()

Serializer中的create()和update()方法用于创建生成一个Model实例,在使用Serializer时,如果要保存反序列化后的实例到数据库,则必须要实现这两方法之一,生成的实例则作为save()返回值返回。方法属性validated_data表示校验的传入数据。

3. is_valid()

当反序列化时,在调用Serializer.save()之前必须要使用is_valid()方法进行校验,如果校验成功返回True,失败则返回False,同时会将错误信息保存到serializer.errors属性中。

4.data

serializer.data中保存了序列化后的数据。

5.errors

当serializer.is_valid()进行校验后,如果校验失败,则将错误信息保存到serializer.errors属性中。

 

ModelSerializer

ModelSerializers继承于Serializer,相比其父类,ModelSerializer自动实现了以下三个步骤:

1.根据指定的Model自动检测并生成序列化的字段,不需要提前定义;

2.自动为序列化生成校验器;

3.自动实现了create()方法和update()方法。

使用ModelSerializer方式如下:

lass StudentSerializer(serializers.ModelSerializer):
    class Meta:
        # 指定一个Model,自动检测序列化的字段
        model = StudentSerializer
        fields = ('id', 'name', 'age', 'birthday')
        # fields = '__all__': 表示所有字段
        # exclude = ('add_time',):  除去指定的某些字段
       # 这三种方式,存在一个即可
        

model

该属性指定一个Model类,ModelSerializer会根据提供的Model类自动检测出需要序列化的字段。默认情况下,所有Model类中的字段将会映射到ModelSerializer类中相应的字段。

fields

如果不希望对Model中所有的字符进行序列化,可以在fields属性中显示指定要进行序列化的字段。

 

 

 

参考:

https://blog.csdn.net/FightFightFight/article/details/80059024

https://blog.csdn.net/l_vip/article/details/79156113

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值