IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> DRF中ModelSerializer的使用 -> 正文阅读

[Python知识库]DRF中ModelSerializer的使用

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.

  • BookInfoSerializer2类中的fields = '__all__'是特殊值,代表序列化所有字段。

  • 通常fields是一个元组或者列表,例如:

    fields = ('name', 'readcount', 'commentcount')
    
  • 使用exclude可以明确排除掉哪些字段

    exclude = ('image', 'id')
    
  • 指明只读字段

    read_only_fields = ('id', 'name')
    

    设置了editable=False的模型字段以及AutoField字段将默认设置为只读。

  • 另外,如果你对ModelSerializer默认生成的某些字段的序列化器不满意,你可以手动重写某些字段的序列化。例如:

    class BookInfoSerializer2(serializers.ModelSerializer):
        """继承自serializers.ModelSerializer"""
    
        # 重写name字段的序列化
        name = serializers.CharField(read_only=True)
    
        class Meta:
            model = BookInfo        # model 指明生成哪个模型类的序列化器
            fields = '__all__'      # fields 指明为模型类的哪些字段被序列化(反序列化)
    
  • extra_kwargs添加额外参数
    extra_kwargs可以给默认生成的序列化器添加额外参数,上面的重写也能做到,并且重写甚至可以改变字段类型,例如从CharFiled变为IntegerField. 但是extra_kwargs更加方便。下面是一个例子:

    class BookInfoSerializer2(serializers.ModelSerializer):
    """继承自serializers.ModelSerializer"""
    
    class Meta:
        model = BookInfo        # model 指明生成哪个模型类的序列化器
        fields = '__all__'      # fields 指明为模型类的哪些字段被序列化(反序列化)
    
        extra_kwargs ={
            # 指定read_only为True, max_value为9999, min_value为0
            "readcount": {"read_only": True, "max_value": 9999, "min_value": 0},
            "commentcount": {"max_value": 9999, "min_value": 0}
        }
    

    通常,我们还需要实现字段验证,因为默认的is_valid()的验证是不够的。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 11:01:17  更:2021-12-10 11:02:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 4:26:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码