Backend - DRF 序列化(django-rest-framework)

目录

一、restful 、django-rest-framework 、swagger 三者的关系

(一)restful API(REST API)

1. rest

2. restful

3. api

4. restfulAPI

(二)django-rest-framework(简称DRF)

(三)swagger

二、DRF 基础配置

(一)安装依赖

(二)配置环境

三、自定义序列化器(定义序列化类,serializers)

(一)Django 序列化 & DRF 序列化器

1. Django 序列化

(1)序列化

(2)反序列化

2. DRF 序列化器

(二)序列化类

(三)常用字段

1. 序列化器的常用字段

2. 自定义字段类型

3. 字段的many参数

4. 字段的多关系子序列化 

(1)source参数的使用

① 重命名字段

② 跨表

③ 执行方法

(2)SerializerMethodField的使用

5. fields的必要性

6. exclude

7. validate_字段名

(四) 创建序列化器(定义序列化类)

1. 一般写法

2. 公共字段

四、使用序列化器(实例化)

(一)构造序列化对象

1. data

2. instance

(二)实例化后的类属性

1. data 属性

2. 实际应用

(1)单个数据模型

(2)多个数据模型

(三)实例化后的类方法

1. is_valid( ) 方法

(1)作用

(2)参数raise_exception

(3)配合validate_字段

2. save() 方法

3. 两者举例

(1)简单举例

(2)完整应用

(四)运行查看

1. 设置路由(urls)

2. 运行情况

五、问题解决

1. ValidationError({'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "dict".', code='not_a_list')]})

2. "The field 'XXX' was declared on serializer SerializerRecipeBodySave, but has not been included in the 'fields' option."


一、restful 、django-rest-framework 、swagger 三者的关系

(一)restful API(REST API)

1. rest

        架构的设计风格,即架构规范(该篇文章主要针对接口的请求方式)。

2. restful

        符合rest原则的开发理念(设计标准)。

3. api

        通讯接口。

4. restfulAPI

        使用REST风格理念的接口(每一种请求API,对应后端的一种数据库操作)。

(二)django-rest-framework(简称DRF)

        是针对Django,生成restfulAPI的框架(序列化)。

        即,给Django提供了跨平台跨语言的Web API框架。

        需安装依赖 djangorestframework,settings.py的INSTALLED_APPS引入rest_framework。

(三)swagger

        针对django-rest-framework(DRF),遵循rest风格理念(restful),生成接口开发文档的工具(UI 界面,可测试、也方便前后端对接)。

        需安装依赖 drf-yasg,settings配置INSTALLED_APPS引入drf_yasg。

swagger的应用,可参考另一篇文章:Backend - Django Swagger-CSDN博客

二、DRF 基础配置

(一)安装依赖

pip install djangorestframework==3.14.0

(二)配置环境

    # settings.py文件中
    INSTALLED_APPS = [
        ...
        'rest_framework',
        ...
    ]

三、自定义序列化器(定义序列化类,serializers)

主要针对Serializers.py 和Models.py。

(一)Django 序列化 & DRF 序列化器

1. Django 序列化

针对DRF的序列化器的应用来讲:

(1)序列化

        序列器将orm模型或queryset物件转换成字典,再由response把字典转换成json的过程。

        即,后端传数据给前端时,将“查询集QuerySet格式”,最终序列化转为“json格式”。

(2)反序列化

        序列化器将request获取的json数据转化为python对象。

        即,前端将数据传给后端时,将json数据,最终反序列化为python对象。

2. DRF 序列化器

        虽然,Django有自带的序列化类(serializers类),但DRF提供的序列化器更实用。

(二)序列化类

        序列化器的序列化类有3种:

        Serializer、ListSerializer、ModelSerializer(最常用的)

(三)常用字段

1. 序列化器的常用字段

        CharField,IntegerField,DateField、BooleanField

2. 自定义字段类型

# 例如自定义Combobox
# 自定义复选框字段类型
class Combobox(serializers.Serializer):
	 bookname = serializers.CharField()
	 bookid = serializers.IntegerField()
# 使用复选框字段
class SerializerAuthor(serializers.Serializer):
	 age = serializers.BooleanField()
	 name = serializers.CharField()
	 books = Combobox(many=False)

3. 字段的many参数

        序列化单个对象,默认参数many=False

        序列化多个对象,指定参数many=True

4. 字段的多关系子序列化 

(1)source参数的使用
① 重命名字段

        自定义返回给前端的字段名。

② 跨表

        获取外键表的字段。

③ 执行方法

        执行model模型类内的自定义方法。

# models.py
class BookType(models.Model):
	bid = models.AutoField(primary_key=True)
	name = models.CharField(max_length=32)
    color = models.CharField(max_length=32)
	fontsize = models.CharField(max_length=32)
	fontcolor = models.CharField(max_length=32)

class PublishPlace(models.Model):
	nid = models.AutoField(primary_key=True)
	name = models.CharField(max_length=32)
	status =  models.BooleanField(default=True, db_index=True)
	city = models.CharField(max_length=32)
	email = models.CharField(max_length=32)

class Author(models.Model):
	aid = models.AutoField(primary_key=True)
	name = models.CharField(max_length=32)
    age = models.IntegerField(default=10)
	sex = models.CharField(max_length=32)
	birthday = models.DateField()

class Book(models.Model):
	bid = models.AutoField(primary_key=True)
	name = models.CharField(max_length=32)
	price = models.DecimalField(max_digits=5, decimal_places=2)
    booktype =  models.ForeignKey(to='BookType', to_field='bid', on_delete=models.CASCADE)
	publish = models.ForeignKey(to='PublishPlace', to_field='pid', on_delete=models.CASCADE)
	authors = models.ManyToManyField(to='Author')

	def __str__(self):
		return self.name

	# 取出该书的出版社
	def getpublishdata(self):
		return {'name': self.publish.name, 'city': self.publish.city, 'email': self.publish.email}
    # 取出该书的所有作者
	def all_author(self):
		return [{'id': author.aid, 'name': author.name, 'age': author.age} for author in self.authors.all()]
# serializers.py 
from rest_framework import serializers
from myAPP import model # 引入model.py
class AuthorSerializer(serializers.ModelSerializer):
	class Meta:
		model = Author
		fields = "__all__"

class SerializerBook(serializers.ModelSerializer):
	authors = AuthorSerializer(many=True)
	book_price = serializers.CharField(source='price') # price是数据库字段,book_price 是自命名的。
	book_type = serializers.CharField(source='booktype.name') # booktype是关联“书籍类型表”的外键字段。name是“书籍类型表”的字段。
	publish2 = serializers.DictField(source="getpublishdata") # 字典形式(执行模型类的方法)
	class Meta:
			model = model.Book
			fields = [ 'name', 'publish', 'authors', 'Publish2', 'book_price','book_type'] 
            # fields是设置最后返回的数据有哪些。book_price和book_type、Publish2 是上方自定义的字段名。 name、Publish、authors是数据库原本的字段名。
(2)SerializerMethodField的使用

        需要搭配 get_XXX( ) 方法。

        可自定义返回给前端的字段值格式。

        一般用于跨表查询。

# serializers.py
class SerializerBook(serializers.ModelSerializer):
	publish = serializers.SerializerMethodField() #设置序列化,才能用下面的get__XXX()方法。
	booktype = serializers.SerializerMethodField() 
	class Meta:
			model = model.Book
			fields = ['publish']  
	def get_publish(self, obj): # 自定义返回的数据格式
			return {'label': obj.city, 'value': obj.email} # city和email都是publish字段关联到的外表publishplace表的字段

	def get_booktype(self, obj):
			booktypes=obj.booktypes.all()  # 全部书籍样式
			b_list=list()
			for booktype in booktypes:
				b_list.append({'name':booktype.color,'age':booktype.fontsize})
			return b_list

5. fields的必要性

        自定义的字段、前端展示的字段,都需要在fields中填写。

6. exclude

        排除不需要显示的字段。

        注意:fields和exclude不能共存。

7. validate_字段名

        写在序列化器中(serializers.py中)。

        需要搭配实例化后的is_valid()方法(views.py中)。实例化序列化器在后面的模块中会讲。

class BookInfoSerializer(serializers.Serializer):
	price = serializers.BooleanField()
	name = serializers.CharField()
	class Meta:
		model = model.Book
		fields = [ 'name', 'price','booktype']

# ① 验证单个字段
	def validate_booktype(self, value):
		if '教育' not in value:
			raise serializers.ValidationError("该书籍不属于教育")
		return value
# ② 验证多个字段
	def validate(self, vals):
		price = vals['price'] 
		booktype = vals['booktype']
		if  booktype =='教育' and price > 100  
			raise serializers.ValidationError("该教育书籍价格大于100")
		return value

(四) 创建序列化器(定义序列化类)

上述自定义序列化器中的一些相关实例,也有讲创建序列化器。

1. 一般写法

# 在myBook项目下新建book_serializer.py文档
from book_models import Book, Author
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book  # model名
        fields = '__all__'

2. 公共字段

# 在myBook项目下新建book_serializer.py文档
from book_models import Book, Author
from rest_framework import serializers

# 不同的序列化,有共同字段
class BaseData(serializers.ModelSerializer):
	decription = serializers.CharField()

class BookSerializer(BaseData):
	 class Meta:
		 model = Book  # model名
		 fields = ['name', 'card', 'place', 'author', 'decription']

class AuthorSerializer(BaseData):
	 class Meta:
		 model = Author  # model名
		 fields = ['name', 'sex', 'age', 'place', 'decription']  

四、使用序列化器(实例化)

主要针对views.py。

(一)构造序列化对象

Serializer(instance=None, data=empty, **kwarg)  # 构造方法,初始化

其中,可传入 instance, data 等参数。

1. data

        是需要验证的资料,预设为empty。

2. instance

        格式:是针对某条queryset数据,预设为None。

        作用:

               实例化serializer(创建序列化对象)时,根据是否传入instance参数,判断执行update还是create。

                即,若传入的instance有值时,则instance.save调用update方法;

                反之,若传入的instance为None(或没有传instance)时,则instance.save调用create方法。

(二)实例化后的类属性

1. data 属性

        获取序列化后的数据。

2. 实际应用

(1)单个数据模型

# 在myBook项目下新建views_book.py文档
from rest_framework.generics import GenericAPIView
from django.http import JsonResponse
from django.db import transaction
from book_models import Book
from book_serializers import BookSerializer 

class BookView(GenericAPIView):
	def get(self, request, *args, **krgs):
		books_qst = Book.objects.get(id=1)  # 获取单笔数据
		book_seri = BookSerializer(books_qst, many=True)  # 数据转换,即数据序列化
		res =  book_seri.data  # 获取数据  {'id': 1, 'bookname': '数据结构', 'author': '萝卜干'}
		return JsonResponse(res)
(2)多个数据模型
# 在myBook项目下新建views_book.py文档
from rest_framework.generics import GenericAPIView
from django.http import JsonResponse
from django.db import transaction
from book_models import Book
from book_serializers import BookSerializer 

class BookView(GenericAPIView):
	def get(self, request, *args, **krgs):
		books_qst = Book.objects.all()  # 查询数据库,获取多笔数据
		book_seri = BookSerializer(books_qst, many=True)  # many=True,表示序列化多条数据
		res =  book_seri.data  # 获取数据 [('id', 1), ('bookname', '数据结构'),  ('author', '萝卜干')]
		return JsonResponse(res, safe=False) # 结果是列表,则需声明safe=False

(三)实例化后的类方法

1. is_valid( ) 方法

(1)作用

        验证newdata是否符合数据库数据规范。

(2)参数raise_exception

        raise_exception=True # 若验证时出现异常,会接收到此异常,向前端返回HTTP 400 响应。

(3)配合validate_字段

        在上述自定义序列化器的模块中,有讲解如何使用。

2. save() 方法

        保存当前数据。

3. 两者举例

(1)简单举例
bookins = models.Book.objects.first()
myserializer = BookSerializer(instance=bookins, data=newdata, partial=True)
myserializer.is_valid(raise_exception=True)
myserializer.save()
(2)完整应用
# 在myBook项目下新建views_book.py文档
from rest_framework.generics import GenericAPIView
from django.http import JsonResponse
from django.db import transaction
from book_models import Book
from book_serializers import BookSerializer 

class BookView(GenericAPIView):
	def post(self, request, *args, **krgs):
		book_data = request.data
		try:
			serializer =BookSerializer(data=book_data)  # 更改数据库
			serializer.is_valid(raise_exception=True)  # 检查是否合格
			with transaction.atomic(): 
				serializer.save()
			res = serializer.data # 获取序列化后的数据
		except Exception as e:
			res = {'error': str(e)}
		return JsonResponse(res)

(四)运行查看

1. 设置路由(urls)

        展示序列化数据的整体流程,涉及models、serializers、views、urls 模块。

# 在myPro项目下新建urls.py文档
from django.urls import path, re_path  # url规则
from myBook import views_book as book_view

urlpatterns = [
    ...
     path('book/', book_view.BookView.as_view()),
] 

2. 运行情况

        浏览器输入链接,回车。

        链接:http://127.0.0.1:8080/myApp/book

        展示界面如下:

五、问题解决

1. ValidationError({'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "dict".', code='not_a_list')]})

原因:在使用序列化时,many设置了为True。表示存入多笔,但实际若只存单笔,则会报错。

解决:many设置为False,或删除该属性。

2. "The field 'XXX' was declared on serializer SerializerRecipeBodySave, but has not been included in the 'fields' option."

原因:字段 XXX 已在序列化程序上声明,但尚未包含在fields“字段”选项中。

解决:在 fields = (  ) 中加上该字段。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/550073.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中立分析腾讯云故障相关的事件

最近腾讯云的故障,让一堆云计算爱好者兴奋地远看指点江山、近看沐猴而冠。我比这群爱好者们更了解云计算,但是我尊重我的读者,你们从我这里看到的科普信息,不仅仅只有情绪价值。 在信息爆炸的时代,大家关注和信任某个媒…

如何使用docker-compose安装数据可视化应用JSON Crack并实现远程访问

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序,能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

微服务中的重要模块

为什么要有微服务? 微服务提高开发效能,避免业务的重复理解,代码重复开发,增加开发效能和代码复用性。 在实际的工作中许多不同的业务有着共同的功能需求,如果我们每遇到一次这种需求就重新去理解构建一次的话会花费大…

msyql中SQL 错误 [1118] [42000]: Row size too large (> 8126)

场景: CREATE TABLE test-qd.eqtree (INSERT INTO test.eqtree (idocid VARCHAR(50) NULL,sfcode VARCHAR(50) NULL,sfname VARCHAR(50) NULL,sfengname VARCHAR(50) NULL,…… ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_general_ci;或 alter table eqtre…

Ctex+texmaker

最近要准备幻灯片,发现我喜欢的模板是用的Ctex,在Texlive下没有办法运行。 于是进行了很多尝试。最后找到一个快捷的办法,删掉自己笔记本中的texlive,在Ctex官网中下载Ctex套件(下载中心 – CTEX),下载的版本是过时版…

Linux 安装KVM虚拟机

什么是KVM虚拟机? KVM 是 Kernel-based Virtual Machine 的缩写,是一种用于虚拟化的开源硬件虚拟化技术。它使用 Linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机。KVM 允许虚拟机直接访问物理硬件资源,从而提供出色的性能和稳定性,同…

解读科技智慧公厕改变生活的革命性创新之路

公共厕所,作为城市基础设施的一部分,一直以来都备受人们诟病。脏乱差、设施老旧、管理混乱,成为公共厕所长期存在的问题。然而,随着科技的不断进步,智慧公厕应运而生,为解决公厕难题,智慧公厕源…

BetterDisplay Pro for Mac 显示器校准和优化软件

BetterDisplay Pro for Mac是一款适用于Mac电脑的显示器校准和优化软件。它可以帮助用户校准显示器的颜色、亮度、对比度和伽马值等参数,使得显示器更加准确和清晰,提高用户的工作效率。 BetterDisplay Pro for Mac v2.0.11激活版下载 这款软件具有直观的…

电脑不能上网,宽带调制解调器出现问题如何处理

目录 一、问题说明 二、解决方案 一、问题说明 内网的设备能互联,内网的各个设备无法连外网。 电脑在检测网络时,出现以下提示: 二、解决方案 首先重启光猫(我们是电信宽带)。 如果还是有问题,再重启…

springboot+vue全栈开发【3.前端篇之Vue基础语法2】

目录 前言Vue基础语法1.事件绑定指令2.条件渲染指令v-show和v-if指令v-else和v-else-if指令 3.列表渲染指令扩展:v-for中的key 前言 hi,这个系列是我自学开发的笔记,适合具有一定编程基础(html、css那些基础知识要会!…

MAC安装CocoaPods遇到的错误Failed to build gem native extension.

MAC安装CocoaPods遇到的错误Failed to build gem native extension. 配置flutter环境的时候报错cocoapods不可用 发现已经安装了CocoaPods,但是不能用 重新安装CocaPods sudo gem install cocoapods重新安装报错如下: 安装RVM curl -L https://get.r…

HBase的数据模型与架构

官方文档:Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文,HBase建立在Hadoop之上,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于…

10. Spring MVC 程序开发

本文源码位置: Spring-MVC 1. Spring MVC 概要 摘自Spring官方: Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes …

Redis的Stream 和 实现队列的方式【List、SortedSet、发布订阅、Stream、Java】

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB,订阅/发布模式基于Stream类型的实现与Java的集成 消息队列问…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

使用代理IP实现Python爬虫中的随机IP请求

目录 前言 一、什么是代理IP? 二、 随机IP请求的实现步骤 1. 获取代理IP列表 2. 随机选择代理IP 3. 发送请求 4. 处理响应 总结 前言 在网络爬虫中,使用代理IP是一种常见的技术手段,它可以帮助我们隐藏真实IP地址,提高爬取…

python生成二维码

要在Python中生成二维码,可以使用第三方库qrcode。首先,确保已经安装了qrcode库: pip install qrcode然后,使用以下代码生成二维码: import qrcodedata "https://mp.csdn.net/mp_blog/creation/editor?spm100…

static+单例模式+类的复合继承

汇编语言 汇编语言是最靠谱的验证“编程语言相关知识点”正确性的方式 汇编语言与机器语言一一对应,每一条机器语言都有与之对应的汇编指令 机器语言是计算机使用的语言,它是一串二进制数字 汇编语言可以通过汇编得到机器语言机器语言可以通过反汇编得到…

LoRA:大模型的低阶自适用(使用BERT在IMDB数据集上运用LoRA微调)

文章目录 简介LoRA文章主要贡献LoRA技术模型图技术细节论文实验结果LoRA在bert的运用LoRA核心代码实战分析 简介 论文链接https://arxiv.org/pdf/2106.09685v2.pdf 本文将先介绍论文中的LoRA技术,然后以BERT为例在IMDB数据集上代码实现运用这项微调技术。 代码数…

Day 14 网络协议

常见网络设备:交换机 路由器 中继器 多协议网关(路由器的前身) 交换机:用于连接统一网络的设备,实现内网设备通信。 从广义上分为:局域网交换机,广域网交换机 从网络构成分为:接…