骄傲的赛亚人

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
View Code

 

使用序列化器

序列化: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)
View Code

 

反序列化: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)
View Code

 

模型序列化器

  模型序列化器自动根据模型创建了对应的字段,简单的实现了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']
View Code

 

综合演练,使用序列化

 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)
View Code

 

posted on 2022-06-15 10:21  骄傲的赛亚人  阅读(20)  评论(0编辑  收藏  举报

导航