restful接口小案例
- 先创建一个子应用,然后在setttings中进行注册
在主路由中进行路由的分发
在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中进行视图的设置
运行项目,进入该路径,即可看到前端接收了后端发来的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文件,此文件称为序列化器文件,在此文件中进行序列化器的定义。
常用字段
选项参数
通用参数
序列化的使用
- 在序列化器中写入字段
在定义序列化器时,序列化的数据字段必须与模型类中的字段相对应,如果是模型类中没有的字段,就需要添加上read_only字段并且如果没有值的话就需要设置一下默认值或者允许其为空。当加上read_only之后,表示该字段可进行读取。
基本使用(在shell中),先查询出一个丈夫对象
构造序列化器对象
获取序列化数据,通过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表示要更新的对象实例,也就是已存在与数据库中的数据