一、REST framework介绍
Django REST framework(DRF)是一个建立在Django基础之上的Web应用开发框架,旨在快速、灵活地构建RESTful风格的API接口。
DRF提供分页、过滤、排序、认证、权限和限流等等强大的功能,除外还提供强大的插件支持。
在之前的文章中我们讲到了Django子应用,也讲了ORM框架,表的处理,那么这章开始,就会慢慢开始进入到平台开发阶段,而DRF 则是重中之重。
二、DRF基础使用
2.1、安装DRF
pipenv install djangorestframework
2.2、配置DRF
三、序列化、反列化
序列化器允许将查询集和模型实例等复杂数据转换为原生Python数据类型,然后可以轻松渲染为JSON、XML或其他内容类型。序列化器还提供反序列化,允许在首先验证传入数据后将解析数据转换回复杂类型。
REST框架中的序列化器与Django的Form和ModelForm类非常相似。我们提供了一个Serializer类,为您提供了一种强大的通用方式来控制响应的输出,以及一个ModelSerializer类,该类为创建处理模型实例和查询集的序列化器提供了有用的快捷方式。
3.1、定义序列化器类
含义:序列化器进行序列化输出操作,简单来说,就是把数据库的数据展示出来
第一步: 在子应用中创建serializers.py文件,然后定义下面代码
from rest_framework import serializers
class BookSerilizer(serializers.Serializer):
name = serializers.CharField(label='书籍名称', help_text='书籍名称', max_length=20, min_length=5) # 书籍名称,最大长度为20个字符,最小长度为5个字符
price = serializers.DecimalField(label='书籍价格', help_text='书籍价格',max_digits=10, decimal_places=2) # 价格,总共10位数字,其中2位是小数
3.2、序列化器操作
第一步:在子应用的views.py文件中定义视图,来使用序列化器
from django.http import JsonResponse
from django.views import View
from djangotest.serializers import BookSerilizer
from test1.models import Book
class BookView(View):
def get(self, request):
queryset = Book.objects.all()
serializer = BookSerilizer(instance=queryset, many=True)
return JsonResponse(serializer.data, safe=False) # safe=False 返回列表嵌套数据的时候需要 这个字段
第二步: 修改url,进行访问
第三步: 接口调用
到这里,我们就已经把数据库的数据通过接口给获取到了,是不是很简单?
3.3、反序列化操作
class BookView(View):
def post(self, request):
try:
python_data = json.loads(request.body) # 从请求体中获取数据
except Exception as e:
return JsonResponse({'msg': '参数有误'}, status=400) # 返回400状态码
serializer11 = BookSerilizer(data=python_data) # 将数据传入序列化器
if not serializer11.is_valid(): # 判断数据是否合法
return JsonResponse(serializer11.errors, status=400) # 返回400状态码
book_obj = Book.objects.create(**serializer11.validated_data) # 创建数据
serializer = BookSerilizer(instance=book_obj) # 将数据序列化
return JsonResponse(serializer.data, status=201) # 返回201状态码
从request获取前端传递的数据—>使用序列化器对象调用.is_valid()方法对传入的数据进行校验—>校验通过后进行保存到表里---->最后,返回正确的数据
四、校验字段
上面介绍了序列化器进行数据的输出和输入,可以理解为就是操作数据库的数据, 包括前端传递的数据进行校验,和从数据库读取数据的时候,能够进行组装,来改变想要返回给前端的数据,所以,我们在进行测试的时候,会去验证传递的参数为空,长度是否满足系统要求,同样,在DRF中,我们也需要对传入的数据进行校验。
4.1、validators自定义规则
通过自定义is_contains_keyword校验方法,然后在序列化器字段中validators来指定自己定义的规则,这个方法是定义在类外的,不推荐
4.2、类中对字段进行校验
采用validate来对传入的数据进行校验,这里会去判断传入的name参数长度,如果不满足,就会抛出异常,attrs是前端传递的数据,可以打个断点查看
4.3、to_internal_value 和 to_representation
4.3.1 to_internal_value (用在对校验完成的数据进行修改会用到)
4.3.2 to_representation (所有字段开始进行序列化输出时的入口方法)
六、模型序列化器(推荐)
在序列化和反序列化的时候,我们用的是serializers.Serializer,需要我们自己去手动填写需要序列化的字段数据,但是通常来说,DRF还有一种快捷的实现,也就是模型序列化器(ModelSerializer),我们把自己定义的序列化器改动一下:
from rest_framework import serializers
from test1.models import Book
class BookSerilizer(serializers.ModelSerializer):
'''
ModelSerializer会自动帮我们序列化Book的字段数据
'''
class Meta:
model = Book
#fields指定模型类中哪些字段需要自动生成序列化器字段
fields = '__all__' # 代表序列化所有字段
#exclude = ('name',) # 代表序列化除了name字段之外的所有字段
def to_representation(self, instance):
tmp = super().to_representation(instance)
return tmp
到这里,序列化器基础使用就已经讲完,重点就是要理解一下,什么事序列化和反序列化,通过BookSerilizer序列化器来看了具体的数据输出和输入,可以参照敲一下代码哦