快速上手Django(六) -Django之Django drf 序列化器Serializer类

news2024/9/20 22:39:58

文章目录

  • 快速上手Django(六) -Django之Django drf 序列化器Serializer类
    • 1. 背景
    • 2. 使用思路
    • 3. 代码demo
    • 4. 【重要】序列化类 ModelSerializer
    • 5. DRF序列化器to_representation()和to_internal_value()方法
      • to_representation如何使用
      • 示例:例如处理返回的日期格式
  • 二、参考

快速上手Django(六) -Django之Django drf 序列化器Serializer类

1. 背景

在Django中,前端传来的数据,一般是JSON格式的数据,获取数据需要通过request.POST.get('xxx)的形式拿到数据,对数据操作完后,返回给前端,也需要转成JSON格式,比较麻烦。

不使用 Serializer 序列化会比较繁琐。drf中提供了序列化器的功能,解决了这一过程。过程:通过ORM从数据库获取数据对象–>调用序列化器,序列化数据–>将序列化的数据返回给前端.

功能
  序列化:把模型对象转为字典,经过response后转成JSON字符串
  反序列化:把客户端传来的数据,经过request后转为字典。并完成数据校验功能。序列化器可以把字典转为模型对象。

2. 使用思路

Django DRF 序列化类
参考URL: https://blog.csdn.net/m0_58987515/article/details/125285865

序列化中有2种序列化,一种为 serializers.Serializer 。另一种在 第一个基础下 再次封装 serializers.ModelSerializer

  1. 在应用下新建任意名字文件例如 serializer.py 文件
  2. 定义一个Serializer类型的序列化器继承 serializers.Serializer 类 或 serializers.ModelSerializer 类。
Serializer 的构造方法为:
Serializer(instance=None, data=empty, **kwarg)

1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据例如
serializer = AccountSerializer(account, context={‘request’: request})

注意点:

  • 使用序列化器的时候需要注意,声明序列化器后,不会自动执行,需要在视图中调用才可以。
  • 序列化器无法直接接收数据,需要我们在视图中创建序列化器对象时把使用的数据传递过来。
  • 序列化器的字段声明类似于表单系统。
  • 开发 restful api 时,序列化器会帮我们把模型数据转换成字典.
  • drf 提供的视图会帮我们把字典转换成 json,或者把客户端发送过来的数据转换字典.

3. 代码demo

from rest_framework.views import APIView
from api import models
from api import ser
from rest_framework.response import Response


class BoosView(APIView):
    def get(self,request,pk):
        # 根据pk拿数据
        book_queryset = models.Books.objects.filter(id=pk).first()
        # 调用序列化组件,序列化数据
        book_ser = ser.BookSerializer(book_queryset)
        # 序列化对象.data就是序列化后的字典
        return Response(book_ser.data)

如果接收一个列表,那么应该将many=True标志传递给嵌套的序列化器。

class Web3UrlViewSet(ModelViewSet):
    queryset = Web3UrlModel.objects.all()

    # 返回常用url
    def list(self, request, *args, **kwargs):
        queryset = Web3UrlModel.objects.get_queryset().order_by("-id")

        serializer = Web3UrlSerializer(queryset, many=True)
        # MyJsonResponse {'code': code, 'msg': msg, 'data': data}
        return MyJsonResponse(data=serializer.data)

4. 【重要】序列化类 ModelSerializer

官网:https://www.django-rest-framework.org/api-guide/serializers/

工作中会发现大部分的序列化都与我们的模型紧密相关。

如果使用序列化器对应 Django 的模型类,DRF为我们提供了 ModelSerializer 模型类序列化器来帮助我们快速创建一个 Serializer 类。 它会根据模型自动生成一组字段;它简单的默认实现了.update()以及.create()方法。总体来说 serializers.ModelSerializer 还是比较好用,写起来方便很多。

ModelSerializer 与常规的 Serializer 相同,但提供了:

  • 基于模型类自动生成一系列字段
  • 基于模型类自动为 Serializer 生成 validators,比如 unique_together
  • 包含默认的 create() 和 update() 的实现
from rest_framework import serializers
from .models import MyBook

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyBook
        fields = '__all__'
        
  • 该序列化类需要继承 serializers.ModelSerializer
  • model 指明参照哪个模型类,例如示例中的指定的模型表,可以理解为将模型表中的字段映射成类似于 title = serializers.CharField(max_length=32)
  • fields 指明为模型类的哪些字段生成,'all’用于表示全部字段,也可以指定字段:fields = [‘title’, ‘price’]。还可以排除字段: exclude [‘title’]

ModelSerializer类,它为创建用于处理模型实例和查询集的序列化程序提供了有用的快捷实现方式。

5. DRF序列化器to_representation()和to_internal_value()方法

DRF所有序列化器类都继承了BaseSerializer 类, 通过重写该类的 to_representation() 和**to_internal_value()**方法可以改变序列化和反序列化的行为,比如给序列化后的数据添加额外的数据,或者对客户端API请求携带的数据进行反序列化处理以及用来自定义序列化器字段。

  • to_representation() 允许我们改变序列化的输出。
  • to_internal_value() 允许改变我们反序列化的输出。

重写 to_representation() 和to_internal_value()方法不仅可以改变序列化数据的输出,处理反序列化的输入数据,还可以用来自定义字段。

to_representation() 和to_internal_value()方法的另一个重要用途就是用来自定义序列化类字段。下例为DRF提供的一个官方演示,展示了如何使用这两个方法自定义了一个包含有x, y坐标的字段CoordinateField字段。

# 自定义字段
class CoordinateField(serializers.Field):
 
 
    def to_representation(self, value):
        ret = {
            "x": value.x_coordinate,
            "y": value.y_coordinate
        }
        return ret
 
 
    def to_internal_value(self, data):
        ret = {
            "x_coordinate": data["x"],
            "y_coordinate": data["y"],
        }
        return ret
 
 
# 定义好后,可以在序列化类中使用。
class DataPointSerializer(serializers.ModelSerializer):
    coordinates = CoordinateField(source='*')
 
 
    class Meta:
        model = DataPoint
        fields = ['label', 'coordinates']

to_representation如何使用

在视图类中,我们指定序列化器类

class UserViewSet(ModelViewSet):
    queryset = User.objects.filter()
    serializer_class = UserSerializer

然后我们自定义序列化器类,我们覆写to_representation

class UserSerializer(serializers.ModelSerializer):
    
    def to_representation(self, instance):
    		...

示例:例如处理返回的日期格式

class ProductsSerializer(serializers.ModelSerializer):
    # 项目数据序列化器

    class Meta:
        model = Products
        fields = '__all__'  # 返回所有字段

    def to_representation(self, instance):
        data = super().to_representation(instance)
        # data['create_time']获取到数据库里存储的时间戳,然后用localtime()函数转换为localtime
        time_local = time.localtime(data['create_time'])
        # 拿到转换后的time_local再用strftime()函数重新格式化时间
        data['create_time'] = time.strftime("%Y-%m-%d %H:%M:%S", time_local)
        # 返回处理之后的数据
        return data

处理之后返回的数据:在这里插入图片描述
在这里插入图片描述

二、参考

重写DRF的to_representation和to_internal_value方法有什么用途?
参考URL: https://blog.csdn.net/weixin_42134789/article/details/115191672
Django DRF 序列化类
参考URL: https://blog.csdn.net/m0_58987515/article/details/125285865

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Habor私有仓库

Harbor简介   Harbor是一个用于存储和分发Docker镜像的企业级Registry的服务器镜像仓库,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供…

Python基础知识进阶之正则表达式

一.match re.match 是从字符串的起始位置匹配一个模式, 匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。 re.match(pattern, string, flags0) pattern: 匹配的正则表达式。 string: 要匹配的字符串。 flags&…

LeetCode刷题复盘笔记—一文搞懂完全背包之322. 零钱兑换问题(动态规划系列第十四篇)

今日主要总结一下动态规划完全背包的一道题目,322. 零钱兑换 题目:322. 零钱兑换 Leetcode题目地址 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返…

MATLAB绘制伪彩图和切片轮廓线图

n6%定义轮数 r(0:n)/n;%定义轮的半径 thetapi*(-n:n)/n;%定义轮的扇区角 Xr*cos(theta); Yr*sin(theta);%定义网格顶点 Cr*cos(2*theta);%定义色图 pcolor(X,Y,C)%绘制伪彩图axis equal tight[x y z v]flow;%打开水流数据 hcontourslice(x,y,z,v,[1:9],[],[0],linspace(-8,2,10…

【面试题】http协议

1. http状态码 1xx:服务器收到请求,但是没有返回结果。2xx:请求成功。200成功。3xx:重定向。301永久重定向,302临时重定向,304资源未被修改。4xx:客户端错误。404资源未找到,403没有…

[附源码]计算机毕业设计基于Springboot药品仓库及预警管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

引擎入门 | Unity UI简介–第2部分(4)

本期我们继续为大家进行Unity UI简介(第二部分)的后续教程 本篇内容 6.添加设置对话框 7.设置对话框的背景图像 8.添加标签 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介(第二部分)篇幅较长,分为八篇&…

Xylan-Alkyne木聚糖-炔基|炔基-PEG-木聚糖

Xylan-Alkyne木聚糖-炔基|炔基-PEG-木聚糖 中文名称:木聚糖-炔基 英文名称:Xylan-Alkyne 别称:炔基修饰木聚糖,炔基-木聚糖 还可以提供PEG接枝修饰木聚糖,Xylan-PEG-Alkyne 木聚糖-聚乙二醇-炔基,炔基-…

​创业15年,50岁回到农村过上退休的生活,上班和创业是两难的选择。

我是老马,现在在农村老家生活1个月。 15年前,大学毕业三年后,在县城里搞到一份稳定的工作,朝九晚五,不慌不忙,结婚生子,后来又这样安安稳稳的过了10年,攒了一些钱,但生活…

【HTML学生作业网页】基于HTML+CSS+JavaScript仿南京师范大学泰州学院(11页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

llvm-ir之核心类设计

llvm-ir之核心类设计引言1 逻辑关系2 class Module3 class IRBuilder4 class Instruction5 class Constant引言 llvm IR是llvm对代码的一种中间表示。它来源AST(抽象语法树),是llvm代码优化的主要对象。 1 逻辑关系 IR的很多组成元素都是以Value为基类。llvm并没有…

【web3空投】SINSO 主网公测空投

Web3.0 基础设施简化去中心化的热数据缓存和数据治理 文章目录1. SINSO Token介绍2. SINSO 主网公测空投2.1 时间2.2 奖励2.3 参与方式2.3.1 第一步(必须完成)2.3.2 第二步(成为矿工)2.3.3 第三步(成为节点担保人)2.3.4 第四步:公开测试反馈表3. 注意事项4. 成为矿工…

这几个方法让你实现EXCEL文件翻译成中文

在日常的工作中,如果遇到需要将EXCEL翻译成其它语言的的时候,我们该怎么办呢?一行一行的复制查找,然后再粘贴回表格中吗?这样操作的话,不仅浪费时间和精力,而且效率还非常的低。那有什么方法可以…

Java项目:SSM图书馆图书管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 读者角色包含以下功能: 读者登录,图书查询,借阅图书,借阅管理,修改密码,借阅记录等功能。 管理员角色包含以下功能: 管理…

Android 系统启动到App 界面完整详解~

通过本篇文章,你将了解到: Android 系统启动流程概览ServiceManager 进程作用Zygote 进程创建与fork子进程system_server 进程作用App 与 system_server 交互Activity 与 View的展示全流程图 1. Android 系统启动流程概览 init 是用户空间的第一个进程&a…

ARM基础(1):Cortex-M3寄存器

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器,但是一些16位的Thumb指令只能访问R0到R7(低寄存器),而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。 所有的寄存器如下图所示&…

Java安全--篇四-Java原生反序列化

Java原生序列化和反序列化 看理论: 序列化和反序列化的详解_tree_ifconfig的博客-CSDN博客_序列化和反序列化 java序列化与反序列化全讲解_mocas_wang的博客-CSDN博客_java反序列化 java 序列化和反序列化 - xbwang520 - 博客园 序列化和反序列化的简单图解&am…

[附源码]Python计算机毕业设计Django微录播室预约管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

【计算机网络】超详细——VLAN、Trunk的配置

1、VLAN 1.1 什么是VLAN? VLAN:即Virtual Local Area Network(虚拟局域网),是物理设备上连接的不受物理位置限制的用户的一个逻辑组,将一个物理LAN划分成多个广播域的通信技术;每一个VLAN是一…

想要高效运行SolidWorks,云上设计了解一下

SolidWorks是达索系统(Dassault Systemes S.A.)旗下SolidWorks公司开发的,运行在微软Windows平台下的第一个三维机械设计软件,涵盖非常广泛的横截面制造业细分市场,目前广泛应用在航天、建筑、汽车生产企业、模具生产企…