当前位置: 首页 > 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 | ---------------------------------------------…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...