Django4—django restframework 序列化
pip/pipenv install djangorestframework
一、序列化与反序列化
序列化操作:将模型类对象(Python中的类)转化为Python中的基本类型
类:模型类、常用类
基本类型:字典、嵌套字典的列表
反序列化操作:将json字符串转化为Python中的基本类型(字典、嵌套字典的列表)-> python中类
1.获取列表数据&获取详情数据
a.数据库读取操作
b.序列化操作:将模型类对象(Python中的类)转化为Python中的基本类型
类:模型类、常用类
基本类型:字典、嵌套字典的列表
2.创建数据
a.数据校验
b.反序列化操作:将json字符串转化为Python中的基本类型(字典、嵌套字典的列表)-> python中类
c.数据库写入操作
3.更新数据
a.数据校验
b.反序列化操作
c.数据库更新操作
4.删除数据
a.数据校验
b.数据库删除操作
二、创建序列化器
1. 序列化器有哪些作用?
- 可以实现序列化输出
- 可以实现反序列化输入
- 数据校验
- 操作数据
2. 创建序列化器类
a.必须得继承Serializer类或者Serializer子类
b.定义的序列化器类中的字段名称‘必须’与模型类中的字段名保持一致
c.默认定义哪些字段,那么哪些字段就会序列化输出,同时这些字段也必须输入(传递)
d.序列化器中定义的字段必须为Field子类
e.CharField 字符串类型
IntegerField int类型
BooleanField 布尔类型
DateTimeField 日期类型
f.label和help_text,与模型类中字段的verbose_name和help_text参数一致
g.CharField可以指定min_length参数为最小长度,max_length参数为最大长度
h.某个序列化器字段设置write_only=True,该字段必须得输入(反序列化输入),但无需输出(序列化输出)
i.某个序列化器字段设置read_only=True,该字段无需输入(反序列化输入),但必须得输出(序列化输出)
j.allow_null=True指定该字段,可以传null值
k.allow_blank=True指定该字段可以传空字符串
l.required=False指定该字段反序列化输入时,可以不传递
m.default指定该字段的默认值,会将默认值作为反序列化的输入值
n.error_messages指定自定义错误提示信息,字段的约束参数名作为key,自定义错误提示信息作为value
serializers.py
from rest_framework import serializers class ProjectSerilizer(serializers.Serializer): name = serializers.CharField(label='项目名称', help_text='项目名称', write_only=True, max_length=10, min_length=3,error_messages={'min_length': '项目名称不能少于3位', 'max_length': '项目名称不能超过10位'}) leader = serializers.CharField(label='项目负责人', help_text='项目负责人', error_messages={'required': '项目负责人字段不能为空'}) is_execute = serializers.BooleanField(label='是否启动项目', help_text='是否启动项目', read_only=True) desc = serializers.CharField(label='项目描述', help_text='项目描述', allow_blank=True,allow_null=True, required=False) create_time = serializers.DateTimeField(label='创建时间', help_text='创建时间', required=False,format='%Y年%m月%d日 %H:%M:%S')
views.py
import json
from django.http import HttpResponse, JsonResponse, HttpRequest
from django.views import View
from .models import Projects
from interfaces.models import Interfaces
from . import serializers
class OneProject:
def __init__(self, name, leader):
self.name = name
self.leader = leader
class ProjectViews(View):
"""
1、需要创建操作项目数据的5个接口
2、获取项目详情数据、获取项目列表数据、更新一条项目数据、删除一条项目数据、创建一条项目数据
3、url以及请求方法的规划
GET /projects/ 获取项目列表数据(json数组形式返回)
POST /projects/ 创建一条项目数据(以json形式传递参数,同时需要将创建成功之后的数据以json形式返回)
GET /projects/<int:pk>/ 获取一条项目详情数据(json对象形式返回)
PUT /projects/<int:pk>/ 更新一条项目数据(以json形式传递参数,同时需要将更新成功之后的数据以json形式返回)
DELETE /projects/<int:pk>/ 删除一条项目数据(返回删除成功json数据)
"""
def get(self, request):
# GET /projects/ 获取项目列表数据(json数组形式返回)
# 1、从数据库中获取所有的项目数据(查询集对象)
# Projects.objects: QuerySet
qs = Projects.objects.all()
# a.如果需要将一个查询集进行序列化,必须得指定many=True
# b.需要给instance传参
# c.如果将一个模型对象序列化,那么无需指定many=True
# d.使用serializer中的data属性,可以获取序列化输出的数据(字典)
serializer = serializers.ProjectSerilizer(instance=qs, many=True)
# 3、将json数据返回前端
return JsonResponse(serializer.data, safe=False, json_dumps_params={"ensure_ascii": False})
def post(self, request: HttpRequest):
# POST /projects/ 创建一条项目数据(以json形式传递参数,同时需要将创建成功之后的数据以json形式返回)
# 1、获取json参数并转化为python中的数据类型(字典或者嵌套字典的列表)
err_msg = {
"status": False,
"msg": "参数有误",
"num": 0
}
try:
json_str = request.body.decode('utf-8')
python_data = json.loads(json_str)
except Exception:
# raise Http404
return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 2、需要进行大量的数据校验
# a.在创建序列化器对象时,给data传参,那么可以实现数据校验
# b.data必须得传递Python中的基本类型(字典或者嵌套字典的列表)
serializer = serializers.ProjectSerilizer(data=python_data)
# c.必须得调用is_valid方法,才会开始进行校验
# d.如果校验通过,会返回True,否则返回False
# e.errors属性用于获取错误提示信息,往往为字典类型;必须得先调用is_valid方法才行
# f.raise_exception=True指定,当校验失败时,自动抛出异常信息
if not serializer.is_valid():
err = serializer.errors
return JsonResponse(err, json_dumps_params={"ensure_ascii": False}, status=400)
# if 'name' not in python_data or len(python_data.get('name')) > 20:
# return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 3、创建项目数据
# obj = Projects(name=python_data.get('name'), leader=python_data.get('leader'), desc=python_data.get('desc', ''))
# obj = Projects(**python_data)
# g.使用序列化器对象.validated_data属性,可以获取校验通过之后的数据
# h.validated_data属性,必须校验之后(调用is_valid()方法),才能获取
obj = Projects(**serializer.validated_data)
obj.save()
serializer = serializers.ProjectSerilizer(instance=obj)
# 5、json数据返回前端
return JsonResponse(serializer.data, json_dumps_params={"ensure_ascii": False})