当前位置: 首页 > news >正文

Django REST Framework(四)DRF Serializer

作用:

1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能

  • 定义序列化器

    • Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。

      接下来,为了方便演示序列化器的使用,我们先创建一个新的子应用sers

      python manage.py startapp sers
      from django.db import models# Create your models here.class Book(models.Model):title = models.CharField(max_length=32,verbose_name="书籍名称")price = models.IntegerField(verbose_name="价格")pub_date = models.DateField(verbose_name="出版日期")

      我们想为Book模型类提供一个序列化器,可以定义如下:

      from rest_framework import serializersclass BookSerializer(serializers.Serializer):title = serializers.CharField()price = serializers.IntegerField()pub_date = serializers.DateField()

      注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

  • 创建Serializer对象

    • 定义好Serializer类后,就可以创建Serializer对象了。

      Serializer的构造方法为:Serializer(instance=None, data=empty, **kwarg)

    • 说明:

      • 用于序列化时,将模型类对象传入instance参数

      • 用于反序列化时,将要被反序列化的数据传入data参数

      • 除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如 serializer = AccountSerializer(account, context={'request': request})

    • 通过context参数附加的数据,可以通过Serializer对象的context属性获取。

      • 使用序列化器的时候一定要注意,序列化器声明了以后,不会自动执行,需要我们在视图中进行调用才可以。

      • 序列化器无法直接接收数据,需要我们在视图中创建序列化器对象时把使用的数据传递过来。

      • 序列化器的字段声明类似于我们前面使用过的表单系统。

      • 开发restful api时,序列化器会帮我们把模型数据转换成字典.

      • drf提供的视图会帮我们把字典转换成json,或者把客户端发送过来的数据转换字典.

  • 序列化器的使用

    • 序列化器的使用分两个阶段:

      • 处理客户端请求时,使用序列化器可以完成对数据的反序列化。

      • 处理服务器响应时,使用序列化器可以完成对数据的序列化。

    • 序列化

      • 基本序列化
        • 先查询出一个学生对象
          from sers.models import Book
          book = Book.objects.get(pk=1)

        • 构造序列化器对象
          from .serializers import BookSerializer
          bookSer = BookSerializer(instance=book)
        • 获取序列化数据,通过data属性可以获取序列化后的数据
        • 路由
          # urls.py
          path("sers/", include("sers.urls")),
          # sers.urls
          path('books/(\d+)', BookView.as_view()),
        • 视图
          from rest_framework.response import Response
          from rest_framework.views import APIView
          from .models import Book
          from .sers import BookSerializerclass BookView(APIView):def get(self, request,id):book = Book.objects.get(pk=id)bs = BookSerializer(instance=book)return Response(bs.data)
        • 如果要被序列化的是包含多条数据的查询集QuerySet,可以通过添加many=True参数补充说明
          class BookView(APIView):def get(self, request):# book = Book.objects.get(pk=1)books = Book.objects.all()bs = BookSerializer(instance=books, many=True)return Response(bs.data)

  • 反序列化

    • 数据验证
      • 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。

        在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。

        验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。

        验证成功,可以通过序列化器对象的validated_data属性获取数据。

        在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。

        通过构造序列化器对象,并将要反序列化的数据传递给data构造参数,进而进行验证。

        from sers.sers import BookSerializer
        bs = BookSerializer(data={"title":"小王子","price":100})
        bs.is_valid()  # 必须先要is_valid,才会有bs.validated_data和bs.errors
        False
        bs.validated_data
        {}
        bs.errors
        {'pub_date': [ErrorDetail(string='This field is required.', code='required')]}

        is_valid()方法还可以在验证失败时抛出异常serializers.ValidationError,可以通过传递raise_exception=True参数开启,REST framework接收到此异常,会向前端返回HTTP 400 Bad Request响应。

      • validate_字段名,对<field_name>字段进行验证,如
        class BookSerializer(serializers.Serializer):title = serializers.CharField(max_length=32)price = serializers.IntegerField(required=True)pub_date = serializers.DateField(required=True)def validate_title(self, value):if 'django' not in value.lower():raise serializers.ValidationError("图书不是关于Django的")return value
      • 测试

        from sers.sers import BookSerializer
        bs = BookSerializer(data={"title":"小王子","price":100})
        bs.is_valid()
        False
        bs.errors
        {'title': [ErrorDetail(string='图书不是关于Django的', code='invalid')], 'pub_date': [ErrorDetail(string='This field is required.', code='required')]}
      • validate,在序列化器中需要同时对多个字段进行比较验证时,可以定义validate方法来验证,如
        
        class BookSerializer(serializers.Serializer):title = serializers.CharField(max_length=32)price = serializers.IntegerField(required=False)pub_date = serializers.DateField(required=False)bread = serializers.IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)bcomment = serializers.IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)def validate_title(self, value):if 'django' not in value.lower():raise serializers.ValidationError("图书不是关于Django的")return valuedef validate(self, data):bread = data.get("bread")bcomment = data.get("bcomment")if bread < bcomment:raise serializers.ValidationError('阅读量小于评论量')return data
        
      • 反序列化-保存数据,

        前面的验证数据成功后,我们可以使用序列化器来完成数据反序列化的过程.这个过程可以把数据转成模型类对象.

        可以通过实现create()和update()两个方法来实现。

        在反序列化数据的时候,就可以通过save()方法返回一个数据对象实例了,book = serializer.save()
    • 基于APIView的接口实现

      • 路由
        urlpatterns = [path('book/', views.BookView.as_view()),re_path('book/(\d+)', views.BookDetailView.as_view()),
        ]
      • 视图
        # Create your views here.
        from rest_framework.views import APIView# 设计增删改查查接口# 视图
        class BookView(APIView):def get(self, request):books = Book.objects.all()bs = BookSerializer(instance=books, many=True)return Response(bs.data)def post(self, request):bs = BookSerializer(data=request.data)if bs.is_valid():bs.save()return Response(bs.data)else:return Response(bs.errors)class BookDetailView(APIView):def get(self, request, pk):book = Book.objects.get(pk=pk)bs = BookSerializer(instance=book)return Response(bs.data)def put(self, request, pk):instance = Book.objects.get(pk=pk)bs = BookSerializer(instance=instance, data=request.data)if bs.is_valid():bs.save()return Response(bs.data)else:return Response(bs.errors)def delete(self, request, pk):Book.objects.get(pk=pk).delete()return Response()
      • serializer
        # 序列化器
        from rest_framework import serializers
        from rest_framework.response import Response
        from .models import Bookclass BookSerializer(serializers.Serializer):title = serializers.CharField()price = serializers.IntegerField()pub_date = serializers.DateField()def create(self, validated_data):new_book = Book.objects.create(**validated_data)return new_bookdef update(self, instance, validated_data):Book.objects.filter(pk=instance.pk).update(**validated_data)instance = Book.objects.get(pk=instance.pk)return instance

相关文章:

Django REST Framework(四)DRF Serializer

作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 3. 反序列化,完成数据校验功能 定义序列化器 Django REST framework中的Serializer使用类来定义&a…...

【C语言】bool 关键字

在C语言中&#xff0c;bool类型用于表示布尔值&#xff0c;即真或假。C语言本身在标准库中并未提供布尔类型&#xff0c;直到C99标准引入了stdbool.h头文件。该头文件定义了bool类型&#xff0c;以及两个常量&#xff1a;true和false。在此之前&#xff0c;通常使用整数来表示布…...

开发电商ERP系统需要接入哪些平台API?

跟随全渠道发展趋势&#xff0c;很多实体商家开设电商店铺&#xff0c;为消费者提供便捷的购物体验&#xff0c;增强消费者的满意度&#xff0c;同时也提升了企业自身的市场竞争力。为了满足商家业务拓展需求&#xff0c;很多原本主要服务于实体商贸企业的ERP服务商&#xff0c…...

Meet AI4S 直播预告丨房价分析新思路:神经网络直击复杂地理环境中的空间异质性

近年来&#xff0c;房地产市场起起落落&#xff0c;房价已经成为了扰动居民幸福感的重要影响因素。大多数家庭都需要面对「买不买房、何时买房、在哪儿买房、买什么房」的艰难抉择&#xff0c;每一个问题的答案都在某种程度上与房价的波动息息相关。 近年来&#xff0c;我国各…...

支持向量机(SVM)在机器学习中的简单示例

目录 工作原理 核函数 SVM用于分类 结果分析 结论 ❤❤❤动动发财的小手点点赞点点关注哦~~~❤❤❤ 支持向量机是一种强大的监督学习模型&#xff0c;用于分类和回归任务。它通过找到数据点之间的最优边界来区分不同的类别。SVM特别适用于那些具有清晰边界但线性不可分的…...

使用Anaconda虚拟环境安装Opencv、pytorch、torchvision踩坑记录

电脑 python 环境版本过高与下载Opencv&#xff08;3.4以下&#xff09;不匹配&#xff0c;因为版本过高部分算法收米&#xff0c; 从而在虚拟环境重新下载python老版本 本文默认您的电脑上已经安装了Anaconda 我是按照这位博文安装的 安装Opencv (详解)安装3.4.1.15版本…...

【人工智能】CPU、GPU与TPU:人工智能领域的核心处理器概述

在人工智能和计算技术的快速发展中&#xff0c;CPU&#xff08;中央处理器&#xff09;、GPU&#xff08;图形处理器&#xff09;和TPU&#xff08;张量处理器&#xff09;作为核心处理器&#xff0c;各自扮演着不可或缺的角色。它们不仅在性能上各有千秋&#xff0c;还在不同的…...

【康复学习--LeetCode每日一题】3099. 哈沙德数

题目&#xff1a; 如果一个整数能够被其各个数位上的数字之和整除&#xff0c;则称之为 哈沙德数&#xff08;Harshad number&#xff09;。给你一个整数 x 。如果 x 是 哈沙德数 &#xff0c;则返回 x 各个数位上的数字之和&#xff0c;否则&#xff0c;返回 -1 。 示例 1&a…...

docker使用jdk21启动jar包报错

[0.007s][warning][os,thread] Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached. [0.007s][error ][gc,task ] Failed to create worker thread解决办法 1 &#xff08;使用doc…...

Object 类中的公共方法详解

Object 类中的公共方法详解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在 Java 中&#xff0c;Object…...

python 字典 一个key 多 value 遍历

在Python中&#xff0c;如果一个键对应多个值&#xff0c;你需要确保这些值被存储在一个容器类型&#xff08;如列表或集合&#xff09;中。你可以使用默认字典&#xff08;collections.defaultdict&#xff09;来简化这个过程。以下是一个示例代码&#xff1a; from collecti…...

vue---基本原理(二)

1、slot的基础理解 slot又名插槽&#xff0c;是vue的内容分发机制&#xff0c;组件内部的模板引擎使用slot元素作为承载分发的出口。是子组件的一个模板标签元素&#xff0c;而这一个标签元素是否显示&#xff0c;以及怎么显示&#xff0c;是由父元素控制的。slot又分为默认插槽…...

桂花网蓝牙网关X1000:引领物联网新时代的智能连接

在物联网技术飞速发展的今天&#xff0c;蓝牙网关作为连接蓝牙设备与互联网的关键设备&#xff0c;其性能与稳定性直接影响到物联网系统的整体运行效果。桂花网蓝牙网关X1000凭借其卓越的性能和广泛的应用场景&#xff0c;成为了物联网领域的佼佼者。 一、产品概述 桂花网蓝牙…...

JAVA案例模拟电影信息系统

一案例要求&#xff1a; 二具体代码(需要在同一个包下创建三个类) Ⅰ&#xff1a;实现类 package 重修;import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {javabean[]moviesnew javabean[4];movies[0] new ja…...

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务10:Hive安装部署

任务描述 任务内容为安装并配置在Hadoop集群中使用Hive。 任务指导 Hive是一个基于Hadoop的数据仓库框架&#xff0c;在实际使用时需要将元数据存储在数据库中 具体安装步骤如下&#xff1a; 1. 安装MySQL数据库&#xff08;已安装&#xff09; 2. 解压缩Hive的压缩包 3…...

第一百四十二节 Java数据类型教程 - Java字符数据类型

Java数据类型教程 - Java字符数据类型 Character类的一个对象包装一个char值。 字符类包含isLetter()和isDigit()方法来检查字符是否为字母和数字。 toUpperCase()和toLowerCase()方法将字符转换为大写和小写。 该类提供了一个构造函数和一个工厂valueOf()方法来从char创建对…...

AI 绘画的常用技巧和操作方法

随着人工智能技术的飞速发展&#xff0c;AI 绘画已经成为设计和艺术领域的一股新兴力量。无论是设计师、艺术家&#xff0c;还是普通的科技爱好者&#xff0c;都能通过 AI 绘画工具创造出令人惊叹的作品。 AI 绘画的基本原理 AI 绘画的核心在于机器学习算法。通过训练大量的图像…...

Kafka入门到精通(四)-SpringBoot+Kafka

一丶IDEA创建一个空项目 二丶添加相关依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springf…...

起飞,纯本地实时语音转文字!

简介 偶然在 github 上翻到了这个项目 https://github.com/k2-fsa/sherpa-ncnn 在没有互联网连接的情况下使用带有 ncnn 的下一代 Kaldi 进行实时语音识别。支持 iOS、Android、Raspberry Pi、VisionFive2、LicheePi4A等。 也就是说语音转文字可以不再借助网络服务的接口&am…...

SQL面试题练习 —— 找出所有连续未登录5天及以上的用户并提取出这些用户最近一次登录的日期

目录 1 题目2 建表语句3 题解 1 题目 找出所有连续未登录5天及以上的用户并提取出这些用户最近一次登录的日期 样例数据 ----------------------------------------------- | user_login.user_id | user_login.login_date | ---------------------------------------------…...

5大突破性功能:重新定义Mac微信体验的终极指南

5大突破性功能&#xff1a;重新定义Mac微信体验的终极指南 【免费下载链接】WeChatExtension-ForMac Mac微信功能拓展/微信插件/微信小助手(A plugin for Mac WeChat) 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 你是否曾因微信消息被撤回而错…...

你的模型评估做对了吗?深入解读泰勒图里的R、RMSE和STD(以sklearn预测为例)

你的模型评估做对了吗&#xff1f;深入解读泰勒图里的R、RMSE和STD&#xff08;以sklearn预测为例&#xff09; 泰勒图作为模型评估的经典可视化工具&#xff0c;表面上只是几个点和线的组合&#xff0c;实则暗藏玄机。许多开发者在使用泰勒图时&#xff0c;常常陷入"距离…...

TrollInstallerX终极指南:一键在iOS设备上安装TrollStore的完整教程

TrollInstallerX终极指南&#xff1a;一键在iOS设备上安装TrollStore的完整教程 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 您是否一直在寻找一种简单可靠的方法&am…...

塑胶件防裂实践:3D检测亲测有效

行业痛点分析在精密制造领域&#xff0c;塑胶件开裂是长期困扰工程师的顽疾。传统检测手段&#xff0c;如卡尺、三坐标测量机&#xff08;CMM&#xff09;或二维影像测量&#xff0c;存在明显局限。它们难以对复杂曲面、内部应力集中区域进行非接触式、全尺寸的量化评估&#x…...

Qwen3-ASR-1.7B在C++项目中的集成与应用

Qwen3-ASR-1.7B在C项目中的集成与应用 1. 环境准备与快速部署 要在C项目中集成Qwen3-ASR-1.7B语音识别功能&#xff0c;首先需要准备好开发环境。这个模型虽然功能强大&#xff0c;但部署起来并不复杂&#xff0c;只需要几个简单的步骤。 系统要求&#xff1a; 操作系统&am…...

快速部署:在星图AI平台训练PETRV2-BEV模型,支持NuScenes数据集

快速部署&#xff1a;在星图AI平台训练PETRV2-BEV模型&#xff0c;支持NuScenes数据集 1. 环境准备与快速部署 1.1 激活Paddle3D环境 首先需要确保已经创建并激活了Paddle3D的conda环境&#xff1a; conda activate paddle3d_env如果尚未创建该环境&#xff0c;建议先安装M…...

Qwen3.5-4B-Claude-Opus入门必看:双RTX4090D GPU加速部署详解

Qwen3.5-4B-Claude-Opus入门必看&#xff1a;双RTX4090D GPU加速部署详解 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型&#xff0c;专门针对结构化分析、分步骤回答以及代码与逻辑类问题进行了优化。该版本采用GGUF量化…...

5步搞定OpenClaw+Qwen3-32B:RTX4090D镜像一键接入实战

5步搞定OpenClawQwen3-32B&#xff1a;RTX4090D镜像一键接入实战 1. 为什么选择云端沙盒方案 当我第一次听说OpenClaw这个开源自动化框架时&#xff0c;内心既兴奋又忐忑。作为一个喜欢折腾新技术的开发者&#xff0c;我迫不及待想尝试这个能像人类一样操作电脑的AI助手。但看…...

Text Control DS Server 5.0 新增了依赖注入服务,允许插件直接与文档处理功能配合使用

启用插件对文档处理 API 的访问权限2026年3月24日Text Control DS Server 5.0 新增了依赖注入服务&#xff0c;允许插件直接与文档处理功能配合使用。TX Text Control DS Server 是一款服务器端文档处理解决方案&#xff0c;旨在将文档生成、编辑和转换功能集成到现代应用程序中…...

Anomalib使用

Anomalib 是一个专注于视觉异常检测的开源库&#xff0c;旨在为开发者、研究人员和工业用户提供一站式解决方案。无论是检测生产线上的产品缺陷、监控视频中的异常行为&#xff0c;还是识别医疗影像中的病灶&#xff0c;Anomalib 都能胜任。其设计理念是简单、模块化、高效&…...