【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

相关文章
|
2月前
|
开发工具 Python
django之drf集成swagger
django之drf集成swagger
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
3月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
3月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
67 0
|
3月前
|
JSON API 网络架构
Django 后端架构开发:DRF 高可用API设计与核心源码剖析
Django 后端架构开发:DRF 高可用API设计与核心源码剖析
67 0
|
5月前
|
存储 JSON 数据库
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术
|
5月前
|
JSON API 数据格式
Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用
Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用
|
5月前
|
JSON 前端开发 API
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
|
5月前
|
JSON 前端开发 Java
Springboot mvc开发之Rest风格及RESTful简化开发案例
Springboot mvc开发之Rest风格及RESTful简化开发案例
63 2
|
5月前
|
JSON 前端开发 API
Django进阶:DRF(Django REST framework)
Django进阶:DRF(Django REST framework)