DRF详解
基本概念
RESTful API规范
API - application programming interface
restful规范是一种编程风格,任何语言和开发框架都可以使用该规范.目的是提高数据交互的通用型和可读性.
幂等性
客户端发起多次同样请求时,服务端的资源产生结果是一样的,则属于幂等接口
如果多次同样请求产生的结果不一样,则属于非幂等接口
序列化
序列化即数据转换格式.常见的序列化方式:json,pickle.base64,struct等等
序列化--将我们的数据转成格式提供给别人
反序列化--将别人给我们的数据转成我们能用的数据格式
序列化器--Serializer的使用
序列化过程:
在应用中创建序列化器文件serializers.py
# serializers.py
from rest_framework import serializers
'''
serializers是drf提供给开发者调用的序列化模块
里面声明了所有的可用序列化器的基类:
Serializer 序列化器基类,drf中所有的序列化器类都必须继承于Serializer
ModelSerializer 模型序列化器基类,是序列化器基类的子类,在工作中,除了Serializer基类之外,是最常用的基类
'''
class StudentSerializer(serializers.Serializer):
'''学生信息序列化器'''
# 1 转换的字段声明
# 字段 = serializers.字段类型(选项=选项值)
id = serializers.IntegerField()
name = serializers.CharField()
sex = serializers.BooleanField()
age = serializers.IntegerField()
description = serializers.CharField()
视图函数views.py
# views.py
from django.views import View
from django.http.response import JsonResponse
from app03.models import Student
from app03.serializers import StudentSerializer
class StudentView(View):
def get(self,request):
# 传递一个数据模型对象
instance = Student.objects.first()
serializer = StudentSerializer(instance=instance)
data = serializer.data
return JsonResponse(data=data,status=200,safe=False)
# 传递多个数据模型对象,一定要加many=True,否则会报错
# instance = Student.objects.all()
# serializer = StudentSerializer(instance=instance,many=True)
# data = serializer.data
# return JsonResponse(data=data,status=200,safe=False)
反序列化过程:
包括数据验证和保存数据
serializers.py
class StudentSerializer(serializers.Serializer):
'''学生信息序列化器'''
# 1 转换的字段声明
# 字段 = serializers.字段类型(选项=选项值,)
id = serializers.IntegerField(read_only=True) # 在客户端提交数据(反序列化阶段)不会要求id字段
name = serializers.CharField(required=True)
sex = serializers.BooleanField(default=True)
age = serializers.IntegerField(max_value=120,min_value=0)
description = serializers.CharField(allow_null=True,allow_blank=True) # 允许客户端不填写内容(None),或者值为""
# 2 如果当前序列化器继承的是ModelSerializer,则需要声明调用的模型信息
# class Meta:
# model = 模型
# fields = ["字段1","字段2",...]
# 3 验证代码的对象方法
# def validate(self,attrs): # validate是固定写法 全局验证
# '''
# 可以验证来自客户端的多个数据,validate是固定方法名
# 比如验证密码和确认密码
# 参数:attrs是在序列化器实例化时的data选项数据
# '''
# return attrs
def validate_name(self,data): # 单个字段验证
# 方法名的格式必须以validate_字段名 为名称,否则序列化器不识别
# validate开头的方法,会自动被is_valid调用
if data in ["python","django"]:
# 在序列化器中,验证失败可以通过抛出异常的方式来告知is_valid
raise serializers.ValidationError(detail="学生姓名不能为python或django",code="validate_name")
# 验证成功以后,必须返回数据
return data
views.py
class StudentView(View):
def get(self,request):
'''反序列化,采用字段选项来验证数据'''
# 1 接收客户端提交的数据
data = json.dumps(request.body)
# 1.1 实例化序列化器得到序列化对象
serializer = StudentSerializer(data=data)
# 1.2 调用序列化器进行数据验证(不抛出异常)
ret = serializer.is_valid()
或者
serializer.is_valid(raise_exception=True)
# 抛出异常,后面验证的代码就不要我们自己写了
序列化器--ModelSerializer的使用

浙公网安备 33010602011771号