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知识库 -> Django REST framework(四)-模型类序列化器ModelSerializer的使用 -> 正文阅读

[Python知识库]Django REST framework(四)-模型类序列化器ModelSerializer的使用

Django REST framework(二)-序列化器定义与使用_simpleyako的博客-CSDN博客

Django REST framework(三)-反序列化的使用_simpleyako的博客-CSDN博客

如果我们想要使用基于Django模型类的序列化器,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。

什么时候声明的序列化器需要继承序列化器基类Serializer,什么时候继承模型序列化器类ModelSerializer?

继承序列化器类Serializer
    字段声明
    验证
    添加/保存数据功能
继承模型序列化器类ModelSerializer
    字段声明[可选,看需要]
    Meta声明
    验证
    添加/保存数据功能[可选]

看数据是否从mysql数据库中获取,如果是则使用ModelSerializer,不是则使用Serializer

ModelSerializer与常规的Serializer相同,但提供了

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为序列化器生成validators,比如unique_together
  • 包含默认的create()和update()的实现

1. 定义

比如我们创建一个BookInfoSerializer:

class ModelSerializer(serializers.ModelSerializer):
   
    # 自动生成序列化验证字段
    class Meta:
        # 1.指定模型类表名
        model = BookInfo
        # 2.指定所有字段
        fields = '__all__'
  • model 指明参照哪个模型类
  • fields 指明为模型类的哪些字段生成

我们可以在python manage.py shell中查看自动生成的BookInfoSerializer的具体实现

自动生成的字段参数值可能不符合我们的要求,所有我们可以通过以下显示指明字段或为自动生成的字段添加额外参数

2. 指定字段

1) 使用fields来明确字段,__all__表名包含所有字段,也可以写明具体哪些字段,如

class ModelSerializer(serializers.ModelSerializer):
    class Meta:
        # 1.指定模型类表名
        model = BookInfo

        # 2.指定创建字段
        fields = ('name', 'readcount')

        

2) 使用exclude可以明确排除掉哪些字段

class ModelSerializer(serializers.ModelSerializer):
    class Meta:
        # 1.指定模型类表名
        model = BookInfo
        # 2.排除不需要的字段exclude(不能和fields同时使用)
        exclude = ('is_delete',)

        

3) 显示指明字段,如:

class ModelSerializer(serializers.ModelSerializer):
    # 显示指明需要进行验证序列化的字段
    name = serializers.CharField(label='名称', max_length=20, min_length=1)

  
    # 自动生成序列化验证字段
    class Meta:
        # 1.指定模型类表名
        model = BookInfo

        # 2.指定创建字段
        fields = ('name', 'readcount')

4) 指明只读字段

可以通过read_only_fields指明只读字段,即仅用于序列化输出的字段

class ModelSerializer(serializers.ModelSerializer):
    # 显示指明需要进行验证序列化的字段
    name = serializers.CharField(label='名称', max_length=20, min_length=1)

    # 自动生成序列化验证字段
    class Meta:
        # 1.指定模型类表名
        model = BookInfo

        # 2.指定创建字段
        # fields = ('name', 'readcount')

        # 3.指定所有字段
        fields = '__all__'

        # 4.指定只序列化的字段
        read_only_fields = ('name',)

       

3. 添加额外参数

我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数

class ModelSerializer(serializers.ModelSerializer):
    # 显示指明需要进行验证序列化的字段
    name = serializers.CharField(label='名称', max_length=20, min_length=1)

    # 自动生成序列化验证字段
    class Meta:
        # 1.指定模型类表名
        model = BookInfo

        # 2.指定创建字段
        # fields = ('name', 'readcount')

        # 3.指定所有字段
        fields = '__all__'

        # 4.指定只序列化的字段
        read_only_fields = ('name',)

        # 5.排除不需要的字段exclude(不能和fields同时使用)
        # exclude = ('is_delete',)

        # 6.添加或修改原有的选项参数
        extra_kwargs = {
             'name': {
                 'require': True,
             },
             'pub_date': {
                 'allow_null' : True
             }
         }

4.添加验证方法?

ModelSerializer与 Serializer的区别:
    1.ModelSerializer继承至Serializer
    2.ModerSerializer已经帮我们定义好了Crete,update方法,只需要在视图中传入相应的参数调用save()方法即可
    3.ModerSerializer已经帮我们实现了一个判断字段唯一值的方法,需要在定义模型类的时候指定字段是唯一值才起作用
    4.其他的单一字段验证,多字段验证需要我们自写(validate_field_name,validate)
    # 自定义单一字段验证
    def validate_name(self, value):
        if value == 'python':
            raise serializers.ValidationError('书名不能为python')
        return value

    # 自定义多字段验证
    def validate(self, attrs):
        """
        :param attrs:对象字典
        :return:attrs
        """
        if attrs['readcount'] > attrs['commentcount']:
            raise serializers.ValidationError('读书量大于评论量')
        return attrs

?5.测试?

? 1)ModelSerializer序列器定义

# -----------------------------------模型类序列化器的使用---------------------------------
class ModelSerializer(serializers.ModelSerializer):
    readcount = serializers.IntegerField(min_value=0, max_value=100000, default=0)
    commentcount = serializers.IntegerField(min_value=0, max_value=100000, default=0)

    # 自动生成序列化验证字段
    class Meta:
        # 1.指定模型类表名
        model = BookInfo

        # 2.排除不需要的字段exclude(不能和fields同时使用)
        exclude = ('id','is_delete')

        # 3.添加或修改原有的选项参数
        extra_kwargs = {
            'name': {
                'required': True,
            },
            'pub_date': {
                'allow_null' : True
            }
        }

    # 自定义单一字段验证
    def validate_name(self, value):
        if value == 'python':
            raise serializers.ValidationError('书名不能为python')
        return value

    # 自定义多字段验证
    def validate(self, attrs):
        """
        :param attrs:对象字典
        :return:attrs
        """
        if attrs['readcount'] > attrs['commentcount']:
            raise serializers.ValidationError('读书量大于评论量')
        return attrs

?

?2) 视图和路由

# 路由
path('ModelSerializer/' , ModelSerializerView.as_view())
# 视图
class ModelSerializerView(View):
    def get(self, request):
        books = BookInfo.objects.all()
        ser = ModelSerializer(instance=books, many=True)
        return http.JsonResponse({
            'data': ser.data
        })

    def put(self, request):
        pk = request.GET.get('pk')
        book = BookInfo.objects.get(id = pk)
        json_dict = json.loads(request.body.decode())
        ser = ModelSerializer(instance=book, data=json_dict)
        ser.is_valid()
        ser.save()
        return http.JsonResponse(ser.data)

    def post(self, request):
        json_str = request.body.decode()
        json_dict = json.loads(json_str)
        ser = ModelSerializer(data=json_dict)
        if ser.is_valid() is False:
            return http.JsonResponse(
                ser.errors
            )
        ser.save()
        return http.JsonResponse({
            'data': ser.data
        })

3)get

4)? put

?5) post

?

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:07:23  更:2022-09-04 01:11:00 
 
开发: 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/15 10:39:18-

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