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

restful接口小案例

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

    在这里插入图片描述

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

    在这里插入图片描述

  3. 在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)

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

    在这里插入图片描述

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

    在这里插入图片描述

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应用

在这里插入图片描述

序列化与反序列化

简洁

什么是序列化和反序列化?
序列化:将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等),例如将Django中的模型类对象转换为JSON字符串,这个转换过程我们称为序列化。
反序列化:将其他格式(字典、JSON、XML等)转换为程序中的数据,例如将JSON字符串转换为Django中的模型类对象,这个过程我们称为反序列化。
在开发REST API时,视图中会频繁的进行序列化和反序列化的编写。

简单理解:
序列化:就是将从数据库中取出的数据,即模型类对象转换为json类型的数据(读取)
反序列化:就是将json类型的数据,转换为可存储到数据库中的数据(写入)

序列化器

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

    在这里插入图片描述

常用字段

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None,min_length=None,allow_blank=False,trim_whitespace=True)
EmailField EmailField(max_length=None,allow_blank=False)
RegexField RegexField(regex,max_length=None,allow_blank=False)
SlugField SlugField(maxlength=50,allow_blank=False)正则字段,验证正则模式[a-zA-ZO-9-]+
URLField URLField(max_length=200,allow_blank=False)

选项参数

参数 作用
max_length 最大长度
min_length 最小长度
allow_blank 允许是否为空
trim_whitespace 是否截断空白字符
max_value 最大值
min_value 最小值

通用参数

在这里插入图片描述

序列化的使用

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

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

在这里插入图片描述

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

    在这里插入图片描述

  2. 构造序列化器对象

    在这里插入图片描述

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

    在这里插入图片描述


    在这里插入图片描述

关联对象嵌套序列化

将序列化的关联对象用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参数时,将被用做反序列化时参数校验使用

  • 使用效果

在这里插入图片描述


在这里插入图片描述

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

wife_1 = serializers.StringRelatedField(label=‘妻子’,read_only=True)
获取到的是魔术方法**str**的返回值

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

序列化过程总结

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,可添加也可不添加,添加时会抛出验证中出现的异常

在这里插入图片描述


在这里插入图片描述

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

  • 对单个字段进行验证

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

在这里插入图片描述


在这里插入图片描述

  • 对多个字段验证

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

在这里插入图片描述

在这里插入图片描述

保存

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

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

调用creat()

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

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

调用update()

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

在这里插入图片描述


在这里插入图片描述

原文地址:https://blog.csdn.net/Oh_Python

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path('authors/$', views.AuthorView.as_view()), re_path('book/(?P\d+)/$', vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = ''' <li><s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 > 依赖jQuery文件 实例-->GET请求: 手动发送 > 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse("OK") 返回一个字符串 return redirect("/index/") 返回URL return render