【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)

简介: 【Django学习笔记 - 17】:序列化和反序列化(restful接口小案例、DRF的工程搭建、序列化器与序列化、验证、保存)

restful接口小案例


  1. 先创建一个子应用,然后在setttings中进行注册

cc5e64d19e57458bb09b2930b0962925.png


在主路由中进行路由的分发

c6e086310e7b402899b669128fa5400e.png

在husband_data子应用的views.py文件中写上Json数据,并返回给前端

from django.views import View
from django.http import JsonResponse
from app_1.models import Husband_1
class Husband_1View(View):
    def get(self, request):
        husbands = Husband_1.objects.all()   # queryset查询集
        data = {}
        for husband in husbands:
            temp = {}
            temp['name'] = husband.name
            temp['age'] = husband.age
            temp['height'] = husband.height
            temp['wight'] = husband.wight
            temp['birthday'] = husband.birthday
            data[husband.id] = temp
        print(data)
        return JsonResponse(data)


在子路由urls.py中进行视图的设置

75c4c71a949f4a2c877b7b1f444d5989.png

运行项目,进入该路径,即可看到前端接收了后端发来的json数据

07702445ce0e40f287387b0ce691b896.png




DRF的工程搭建


DRF的介绍


   1.在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的。


   2.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增、删、改、查的实现流程基本套路化,所以这部分代码也是可以复用简化编写的:


   增:校验请求数据→执行反序列化过程->保存数据库->将保存的对象序列化并返回

   删:判断要删除的数据是否存在-→执行数据库删除


   改:判断要修改的数据是否存在→校验请求的数据->执行反序列化过程->保存数据库>将保存的对象序列化并返回


   查:查询数据库-→将数据序列化并返回


   3.DRF将序列化和反序列化的业务逻辑进行了封装,程序员只需要将序列化和反序列化的数据传给DRF即可。


   Django REST framework可以帮助我们简化上述两部分的代码编写,大大提高REST API的开发速度。


   通常简称为DRF框架或REST framework。


   DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目。



DRF的特点


1、提供了定义序列化器Serializer的方法,可以快速根据Django ORM或者其它库自动列化/反序列化;


2、提供了丰富的类视图、Mixin扩展类,简化视图的编写;


3、丰富的定制层级:函数视图、类视图、视图集合到自动生成API,满足各种需要·多种身份认证和权限认证方式的支持;


4、内置了限流系统;


5、直观的API web界面;·可扩展性,插件丰富。





DRF的安装和注册



1、安装DRF

pip install djangorestframework


2、添加rest_framework应用

28694f633dd7408c9afc482373d6bc80.png




序列化与反序列化


简洁


   什么是序列化和反序列化?


   序列化:将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象转换为JSON字符串,这个转换过程我们称为序列化。


   反序列化:将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。


   在开发REST API时,视图中会频繁的进行序列化和反序列化的编写。


   简单理解:


   序列化:就是将从数据库中取出的数据,即模型类对象转换为json类型的数据(读取)

   反序列化:就是将json类型的数据,转换为可存储到数据库中的数据(写入)



序列化器

  • 在创建的子应用husband_data中创建一个serializers.py文件,此文件称为序列化器文件,在此文件中进行序列化器的定义。

606f0d136cd04c22b4df54c8d971ff91.png


常用字段

image.png

选项参数

image.png

通用参数

43512151a69246a59e1aa13091a8d4a2.png




序列化的使用


  1. 在序列化器中写入字段


在定义序列化器时,序列化的数据字段必须与模型类中的字段相对应,如果是模型类中没有的字段,就需要添加上read_only字段并且如果没有值的话就需要设置一下默认值或者允许其为空。当加上read_only之后,表示该字段可进行读取。


d2c019bd958642018421b4cabdf6e9b7.png


基本使用(在shell中),先查询出一个丈夫对象

99b325393db04913b010682c21f80bbc.png

构造序列化器对象

d043e63249654d7d831ef7cce21de0f4.png


获取序列化数据,通过data属性获取序列化后的数据

25e44d96c2384f1180bf26297499a50e.png

42cdde02bb1640919b4ecb6211253b08.png


关联对象嵌套序列化


将序列化的关联对象用id表示

PrimaryKeyRelatedField:
    此字段将被序列化为关键对象的主键。将关联模型的id序列化。
    wife_1 = serializers.PrimaryKeyRelatedField(label=‘英雄’, queryset=Wife_1.objects.all())
    wife_1 = serializers.PrimaryKeyRelatedField(label=‘妻子’, read_only=True)

   总结:指明字段时需要包含read_only=True或者queryset参数


   包含read_only参数时,该字段不能用作反序列化使用


   包含queryset参数时,将被用做反序列化时参数校验使用


   使用效果


3aa3a8b561d04df5889aab9e16495841.png


605a554248a5492dac6c366dd89992fb.png


将序列化的关联对象用字符串表示


wife_1 = serializers.StringRelatedField(label=‘妻子’, read_only=True)

获取到的是魔术方法**str**的返回值


d7a5311a94c8496382695ae08953416e.png

3def8fae8fb44bf3987a635c642c9053.png


88f72481e882435eba26171a3d10e0ca.png



序列化过程总结


1.定义一个序列化器


⒉.从数据库中取出数据


3.将取出来的数据传入序列化器中


4.输出序列化后的数据


反序列化的使用


验证


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


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


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


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

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


   验证例子

   serialzier.is_valid(raise_exception=True)

   reise_exception=True,可添加也可不添加,添加时会抛出验证中出现的异常


61aad071e50f4710b141db065315f0f8.png


aa2e612b1b2b4cf2bb271b3eac3d83e3.png


设置序列化验证抛出的异常


  • 对单个字段进行验证

value验证的是哪一个字段,那么value值就是哪一个字段的值


92f1edc5ed7f4f88a5fb37b3c2068cd0.png

e0e62af32e4f431c9da0438bcea92194.png


  • 对多个字段验证

Validate:在序列化器中需要同时对多个字段进行比较验证时,定义validate方法来验证。


cf63de8476c9470e85be0e9111fb8e2a.png

38231941e6784f599d966ed53b4dab28.png


保存

   如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,**create()**被调用,相反,如果传递了instance实例,则调用save()方法的时候,**undate()**被调用。


   注意:在执行save()操作之前,不要进行serializer.data操作,否则会报错。



调用creat()

序列化器返序列化之后保存数据需要重写create方法,validated_data表示已通过验证的数据。


ecdc2930dedb43ee903d1a6b36119b45.png


24f45e63fe354a25b97539e4975098b1.png


15405817e5dc427f870e5e2152448afe.png


调用update()

instance表示要更新的对象实例,也就是已存在与数据库中的数据


8c1dbfc78cd54967aa76a6346b9040d6.png

57343ef97a26400cb493973c2f0568bc.png

相关文章
|
3月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
115 6
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
人工智能 BI 数据处理
【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种
本文介绍了一个基于Python开发的医院挂号管理系统,该系统包含医生、患者、管理员三种角色,旨在优化挂号流程,提高医疗服务质量和管理效率,并通过信息化手段提升患者就医体验和医院运营决策的数据支持能力。
131 2
【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管理员三种
|
4月前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
4月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
5月前
|
API 数据安全/隐私保护 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
【7月更文挑战第23天】Python的RESTful API设计在Web开发中流行,提升效率与体验。REST强调HTTP方法(GET, POST, PUT, DELETE)操作资源。使用Flask框架可快速实现API,如管理用户信息。示例代码展示如何创建、读取、更新和删除用户,通过不同HTTP方法和URL路径。实际应用中,增加验证、错误处理和权限控制可增强API的安全性和稳定性。安装Flask后,可运行代码测试API功能。
68 6
|
5月前
|
安全 API 网络架构
Python RESTful API设计新篇章,打造高效、易用、安全的Web服务接口,你准备好了吗?
【7月更文挑战第22天】在数字化转型中,RESTful API借助Python的Flask和Django REST Framework,提供高效、易用和安全的接口设计。Flask示例展示了简洁的CRUD操作,Swagger等工具增进API文档的易用性,而HTTPS、JWT和输入验证确保安全性。Python RESTful API设计涉及效率、可用性和安全,是不断进化的Web服务接口的关键。准备好踏上这一新篇章了吗?一起探索,创造卓越!
69 2
|
5月前
|
安全 API 网络安全
Django RESTful API安全实践
【7月更文挑战第19天】构建安全的Django RESTful API需要综合考虑多个方面,包括身份验证与授权、数据验证与清洗、安全的HTTPS连接、限制请求频率以及审计与日志记录等。通过实施这些安全实践,可以有效地保护API服务免受各种安全威胁的侵害,确保用户数据的安全性和服务的可用性。开发者在开发RESTful API时,应始终将安全性放在首位,确保API服务的安全可靠。
|
6月前
|
存储 JSON 数据库
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
|
6月前
|
JSON API 数据格式
Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用
Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用