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的使用

 

posted @   EricYJChung  阅读(413)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示