zl程序教程

您现在的位置是:首页 >  其他

当前栏目

DRF中ModelSerializer的使用

2023-04-18 14:40:43 时间

ModelSerializer

DRF的serializers.Serializer所生成的序列化器是最基本的,它可以为数据库模型类定义,也可以为非数据库模型类的数据定义。一般而言,我们使用序列化器对应的都是Django的数据库模型类。DRF为我们提供了ModelSerializer来方便的对应于一个models.

ModelSerializer基于模型类自动生成一系列字段;此外还提供了create()和update()的默认实现。

下面定义新的序列化器,它将继承自ModelSerializer类。

class BookInfoSerializer2(serializers.ModelSerializer):
    """继承自serializers.ModelSerializer"""
    class Meta:
        model = BookInfo        # model 指明生成哪个模型类的序列化器
        fields = '__all__'      # fields 指明为模型类的哪些字段被序列化

在终端中查看自动生成的序列化器如下:

>>> from apps.book.serializers import BookInfoSerializer2
>>> BookInfoSerializer2()
BookInfoSerializer2():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(label='名称', max_length=20)
    pub_date = DateField(label='发布日期')
    readcount = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
    commentcount = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
    is_delete = BooleanField(label='逻辑删除', required=False)
    image = ImageField(allow_null=True, label='图片', max_length=100, required=False)

下面贴上model类的定义。

class BookInfo(models.Model):
    """书籍信息模型"""
    name = models.CharField(max_length=20, verbose_name='名称') #图书名称
    pub_date = models.DateField(verbose_name='发布日期') #发布日期
    readcount = models.IntegerField(default=0, verbose_name='阅读量') #阅读量
    commentcount = models.IntegerField(default=0, verbose_name='评论量') #评论量
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') #逻辑删除
    image = models.ImageField(upload_to='book/', verbose_name='图片', null=True)

通过观察模型类和序列化器类,我们可以发现一些规律。 id是模型类默认生成的主键,序列化器让其变成只读(只能序列化,不能反序列化);通过name字段,可以发现模型类的verbose_name变成了序列化器中的label,max_length等对应不变;观察readcount字段,会发现整形类型会被序列化器自动加上max_value和min_value的限制;有默认值的字段,会自动加上required=False来取消限制;而允许为空的字段则会字段添加allow_null=True和required=False.