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的使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通