zoukankan      html  css  js  c++  java
  • 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. 序列化器有哪些作用?

    1. 可以实现序列化输出
    2. 可以实现反序列化输入
    3. 数据校验
    4. 操作数据

    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})
    
  • 相关阅读:
    【miscellaneous】北斗短报文
    【miscellaneous】GPRS本质论
    【miscellaneous】GPRS本质论
    【视频处理】模拟视频与数字视频的区别
    【视频处理】模拟视频与数字视频的区别
    【视频处理】模拟视频信号及其传输
    【视频处理】模拟视频信号及其传输
    【机器学习】贝叶斯决策论小结
    【机器学习】贝叶斯决策论小结
    【VS开发】DLL和ocx的区别
  • 原文地址:https://www.cnblogs.com/erchun/p/14348493.html
Copyright © 2011-2022 走看看