Django REST Framework(四)DRF Serializer
作用:
1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能
-
定义序列化器
- Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
接下来,为了方便演示序列化器的使用,我们先创建一个新的子应用sers
python manage.py startapp sersfrom 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是独立于数据库之外的存在。
- Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.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语言中,bool类型用于表示布尔值,即真或假。C语言本身在标准库中并未提供布尔类型,直到C99标准引入了stdbool.h头文件。该头文件定义了bool类型,以及两个常量:true和false。在此之前,通常使用整数来表示布…...
开发电商ERP系统需要接入哪些平台API?
跟随全渠道发展趋势,很多实体商家开设电商店铺,为消费者提供便捷的购物体验,增强消费者的满意度,同时也提升了企业自身的市场竞争力。为了满足商家业务拓展需求,很多原本主要服务于实体商贸企业的ERP服务商,…...
Meet AI4S 直播预告丨房价分析新思路:神经网络直击复杂地理环境中的空间异质性
近年来,房地产市场起起落落,房价已经成为了扰动居民幸福感的重要影响因素。大多数家庭都需要面对「买不买房、何时买房、在哪儿买房、买什么房」的艰难抉择,每一个问题的答案都在某种程度上与房价的波动息息相关。 近年来,我国各…...
支持向量机(SVM)在机器学习中的简单示例
目录 工作原理 核函数 SVM用于分类 结果分析 结论 ❤❤❤动动发财的小手点点赞点点关注哦~~~❤❤❤ 支持向量机是一种强大的监督学习模型,用于分类和回归任务。它通过找到数据点之间的最优边界来区分不同的类别。SVM特别适用于那些具有清晰边界但线性不可分的…...
使用Anaconda虚拟环境安装Opencv、pytorch、torchvision踩坑记录
电脑 python 环境版本过高与下载Opencv(3.4以下)不匹配,因为版本过高部分算法收米, 从而在虚拟环境重新下载python老版本 本文默认您的电脑上已经安装了Anaconda 我是按照这位博文安装的 安装Opencv (详解)安装3.4.1.15版本…...
【人工智能】CPU、GPU与TPU:人工智能领域的核心处理器概述
在人工智能和计算技术的快速发展中,CPU(中央处理器)、GPU(图形处理器)和TPU(张量处理器)作为核心处理器,各自扮演着不可或缺的角色。它们不仅在性能上各有千秋,还在不同的…...
【康复学习--LeetCode每日一题】3099. 哈沙德数
题目: 如果一个整数能够被其各个数位上的数字之和整除,则称之为 哈沙德数(Harshad number)。给你一个整数 x 。如果 x 是 哈沙德数 ,则返回 x 各个数位上的数字之和,否则,返回 -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 (使用doc…...
Object 类中的公共方法详解
Object 类中的公共方法详解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,Object…...
python 字典 一个key 多 value 遍历
在Python中,如果一个键对应多个值,你需要确保这些值被存储在一个容器类型(如列表或集合)中。你可以使用默认字典(collections.defaultdict)来简化这个过程。以下是一个示例代码: from collecti…...
vue---基本原理(二)
1、slot的基础理解 slot又名插槽,是vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发的出口。是子组件的一个模板标签元素,而这一个标签元素是否显示,以及怎么显示,是由父元素控制的。slot又分为默认插槽…...
桂花网蓝牙网关X1000:引领物联网新时代的智能连接
在物联网技术飞速发展的今天,蓝牙网关作为连接蓝牙设备与互联网的关键设备,其性能与稳定性直接影响到物联网系统的整体运行效果。桂花网蓝牙网关X1000凭借其卓越的性能和广泛的应用场景,成为了物联网领域的佼佼者。 一、产品概述 桂花网蓝牙…...
JAVA案例模拟电影信息系统
一案例要求: 二具体代码(需要在同一个包下创建三个类) Ⅰ:实现类 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的数据仓库框架,在实际使用时需要将元数据存储在数据库中 具体安装步骤如下: 1. 安装MySQL数据库(已安装) 2. 解压缩Hive的压缩包 3…...
第一百四十二节 Java数据类型教程 - Java字符数据类型
Java数据类型教程 - Java字符数据类型 Character类的一个对象包装一个char值。 字符类包含isLetter()和isDigit()方法来检查字符是否为字母和数字。 toUpperCase()和toLowerCase()方法将字符转换为大写和小写。 该类提供了一个构造函数和一个工厂valueOf()方法来从char创建对…...
AI 绘画的常用技巧和操作方法
随着人工智能技术的飞速发展,AI 绘画已经成为设计和艺术领域的一股新兴力量。无论是设计师、艺术家,还是普通的科技爱好者,都能通过 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 | ---------------------------------------------…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
