day12序列化器
django REST famework
简介
构建RESTful风格API的 一个基于django的web框架,drf框架,rest framework框架
特性:
- 强大的序列化器,可以高效的进行反序列化和序列化操作
- 极丰富的类视图,Mixin扩展视图,ViewSet视图
- 提供了直观的web api界面
- 支持多种身份认证和权限认证
- 强大的排序,过滤,分页,搜索,限流等功能
- 扩展性强,插件丰富
依赖
python 3.5-3.9
django2.2,3.0,3.1,3.2
安装
1、下载安装包
pip install djangorestframework
2、安装到项目
# 安装应用 INSTALLED_APPS = [ ... 'rest_framework' # 新加 ]
序列化器
drf提供了以各serializer类,它可以提供非常方便的序列化模型对象和查询集为json或者其它形式的内容,还可以提供反序列化,允许在通过验证传入数据后将解析的数据转换为复杂的类型对象
定义序列化器
序列化器一般定义在每个应用目录下的serializers.py模块
1 class CustomStudentSerializer(serializers.Serializer): 2 """ 3 自定义,比较繁琐的学生序列化器 4 """ 5 # 定义需要序列化、反序列化的字段 6 id = serializers.IntegerField(label='学生id', read_only=True) 7 name = serializers.CharField(label='姓名') 8 sex = serializers.IntegerField(label='性别', default=1) 9 age = serializers.IntegerField(label='年龄', required=False, allow_null=True) 10 qq = serializers.IntegerField(label='qq号码', required=False, allow_null=True) 11 phone = serializers.IntegerField(label='手机号码', required=False, allow_null=True) 12 channel = serializers.CharField(label='渠道', read_only=True) 13 c_time = serializers.DateTimeField(label='创建时间', read_only=True) 14 15 def create(self, validated_data): 16 """ 17 创建对象时调用 18 :param validated_data: 19 :return: 20 """ 21 return Student.objects.create(**validated_data) 22 23 def update(self, instance, validated_data): 24 """ 25 更新对象时调用 26 :param instance: 27 :param validated_data: 28 :return: 29 """ 30 for key, value in validated_data.items(): 31 setattr(instance, key, value) 32 instance.save() 33 return instance
使用序列化器
序列化:obj ->json/html
注意:
序列化查询集时,要使用many=True,序列化单个数据不需要
import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'study_django.settings') django.setup() from crm.models import Student from crm.serializers import StudentSerializer import json # 1、创建一个实例 obj = Student.objects.first() # ---------------序列化单个 # 2、通过序列化器进行序列化 serializer = StudentSerializer(instance=obj) print(serializer.data) print(json.dumps(serializer.data)) # ---------------序列化查询集 # 3、还可以序列化查询集,序列化查询集的时候要用many参数 obj = Student.objects.all() s = StudentSerializer(obj, many=True) print(s.data) print(s)
反序列化:json->obj
注意:
1、如果instance存在,那么save的时候调用update,否则就是create
2、更新的对象要使用instance参数,对象传递给instance,数据字典传递给data参数,用data的数据跟新obj对象
import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'study_django.settings') django.setup() from crm.models import Student from crm.serializers import StudentSerializer import json data = { 'name': '李小毛', 'sex': 1, 'age': 18, 'qq': 123456776, 'phone': 155244422447 } # --------------------------创建对象 # 2、反序列化 ---------------创建 s = StudentSerializer(data=data) # 进行校验 if s.is_valid(): instance = s.save() print(instance) else: print(s.errors) # 更新对象,更新的对象要使用instance参数,数据字典传递给data参数 objs = Student.objects.get(name="李小毛") print(objs.phone) s = StudentSerializer(instance=objs, data=data) if s.is_valid(): instance = s.save() print(objs.phone) else: print(s.errors)
模型序列化器
模型序列化器自动根据模型创建了对应的字段,简单的实现了create和update方法
1 from rest_framework import serializers 2 from .models import Student 3 4 5 class StudentSerializer(serializers.ModelSerializer): 6 """ 7 模型序列化器 8 """ 9 # 元信息 10 class Meta: 11 # 指定根据那个模型生成序列化器 12 model = Student 13 # 指定序列化那些字段 14 # fields = ['id', 'name', 'sex'] 15 # 序列化所有字段 16 fields = '__all__' 17 # 排除某个字段 18 # exclude = ['id']
综合演练,使用序列化
1 class StudentView(View): 2 """ 3 restful风格的学生视图 4 """ 5 6 def get(self, request, pk=None): 7 """ 8 学生列表、学生详情 9 :param request: 10 :param pk: 11 :return: 12 pk为空就是学生列表,pk不为空就是学生详情 13 """ 14 if pk is None: 15 # 1、获取学生列表 16 objs = Student.objects.all() 17 # 2、使用序列化器,序列化查询集,序列化查询集要使用many 18 serializer = StudentSerializer(objs, many=True) 19 return JsonResponse(data=serializer.data, safe=False) # 当data不是一个字典的时候,要加上safe=False 20 else: 21 # 学生详情 22 # 1、获取学生对象 23 obj = get_object_or_404(Student, pk=pk) 24 # 2、序列化,单个数据不用many参数 25 serializer = StudentSerializer(obj) 26 # 3、返回json响应 27 return JsonResponse(data=serializer.data) 28 29 def post(self, request): 30 """ 31 创建学生 32 :param request: 33 :return: 34 """ 35 # 1、接受数据转换为字典 36 data = json.loads(request.body) 37 # 2、创建序列化器 38 serializer = StudentSerializer(data=data) 39 # 3、校验 40 if serializer.is_valid(): 41 serializer.save() 42 # 校验成功,返回创建的对象 43 return JsonResponse(data=serializer.data, status=201) 44 else: 45 # 校验失败,返回错误信息 46 return JsonResponse(data=serializer.errors, status=400) 47 48 def put(self, request, pk): 49 """ 50 修改学生 51 :param request: 52 :return: 53 """ 54 obj = get_object_or_404(Student, pk=pk) 55 # 2、获取数据 56 data = json.loads(request.body) 57 # 3、创建序列化器,更新需要穿一个对象 58 # 要修改的对象传递给instance参数,数据字典传递给data参数 59 # 如果instance存在,那么save的时候调用update,否则就是create 60 serializer = StudentSerializer(instance=obj, data=data) 61 # 4、校验 62 if serializer.is_valid(): 63 serializer.save() 64 # 校验成功,返回创建的对象 65 return JsonResponse(data=serializer.data, status=200) 66 else: 67 # 校验失败,返回错误信息 68 return JsonResponse(data=serializer.errors, status=400) 69 70 def delete(self, request, pk): 71 """ 72 删除学生 73 :param request: 74 :param pk: 75 :return: 76 """ 77 # 1、获取对象 78 obj = get_object_or_404(Student, pk=pk) 79 # 2、删除 80 obj.delete() 81 # 3、返回数据 82 return HttpResponse(status=204)