Django之REST framework框架与Serializer序列化

 
 

一、简介

REST framework在Django框架的基础上,进行了二次开发,主要用于构建Restful API,简称DRF框架。

 

二、特性

提供了强大的Serializer序列化器,可以高效地进行序列化与反序列化操作

提供了丰富的类视图、Mixin扩展类、ViewSet视图集

提供了直观的Web API界面

实现了多种身份认证和权限认证

实现了排序、过滤、分页、搜索、限流等功能

可扩展性强,插件丰富

 

三、安装与配置

1、安装

1 pip install djangorestframework
2 pip install markdown

 

2、配置

在全局settings.py中添加子应用,将'rest_framework'添加到INSTALLED_APPS列表

INSTALLED_APPS = [
'rest_framework',
]

 

四、序列化器

当我们进行Restful接口开发时,视图中最主要做的其实就是三件事:

  • 将请求的数据(json等格式)转换为模型类对象 —— 反序列化
  • 操作数据库(读、写)
  • 将模型类对象转换为响应数据 —— 序列化
 

1、序列化与反序列化

1.1、序列化

概念:将变量从内存中取出,变为可存储或可传输的过程。简单来说就是,程序中的数据类型转换为前端可处理的数据格式,如json。

使用场景:从数据库中查询到的数据转换为json,返回给前端。(查询数据)

 

1.2、反序列化

概念:将变量的内容从序列化的对象写到内存里的过程。简单来说就是,格式为json、xml、text等的数据转换为程序中的数据类型。
使用场景:前端传递过来的数据,反序列化后,存储到数据库中。(创建、更新数据)
 

2、使用

2.1、定义序列化器类

在对数据进行序列化操作前,首先需要在对应的应用目录下创建serializers.py,引入serializers模块,定义一个序列化器类,继承serializers.Serializer父类。

from rest_framework import serializers
 
class ProjectSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称', read_only=True)
    desc = serializers.CharField(max_length=200, label='项目简介', help_text='项目简介', allow_null=True, allow_blank=True, default='项目简介')
    update_time = serializers.DateTimeField(label='更新时间', help_text='更新时间', required=False)

 

序列化器类中定义的字段,如果没有特殊的约束,必须传参,同时也都会返回。

 

在定义序列化器类时,需要注意的是:

  • 序列化器类字段名需要与模型类中的字段名相同
  • 序列化器类的字段类型:CharField、BooleanField、IntegerField等要与模型类中的字段对应
 

2.2、序列化器模型类对象

场景:序列化输出 —— 查询数据

在进行序列化操作时,需要传入instance参数

'''
语法:序列化器类(instance=模型类对象/查询集, many=True)
如果未传递many=True,则序列化器对象返回字典,否则返回嵌套字典的列表
'''
serializer_obj = ProjectSerializer(instance=qs, many=True)

 

来看一个完整的序列化过程,以项目查询为例

复制代码
from django.http import JsonResponse
from django.views import View
 
from .models import Projects
from .serializers import ProjectSerializer
 
 
class ProjectsPage(View):
  # 查询项目信息:id默认为空
  def get(self, request, param=None):
    res = {}
    try:
      if param:
        # 根据id查询项目详情
        pro_obj = Projects.objects.get(id=param)
        serializer_obj = ProjectSerializer(instance=pro_obj)
        res['data'] = serializer_obj.data
      else:
        # 查询接口列表
        qs = Interfaces.objects.all()
        serializer_obj = ProjectSerializer(instance=qs, many=True)
        res['data'] = serializer_obj.data
 
      res['code'] = 0
      res['message'] = '查询成功'
    except Exception as e:
      res['code'] = 1
      res['message'] = f'查询失败:{e}'
    
    return JsonResponse(data)
复制代码

 

posted @   二鬼  阅读(212)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示