当前位置: 首页 > news >正文

django之BaseSerializer

BaseSerializer 是 Django REST framework (DRF) 中的一个核心类,用于将复杂的数据类型(如查询集和模型实例)转换为 Python 数据类型,以便于渲染成 JSON、XML 或其他内容类型。BaseSerializer 是所有序列化器的基类,提供了一些常用的方法和属性。以下是一些常用的方法和属性的介绍:

常用方法

  1. to_representation(instance)

    • 描述: 将模型实例或查询集转换为原生 Python 数据类型。
    • 用途: 用于序列化数据,即将复杂数据类型转换为简单的、可序列化的数据类型。
    • 示例:
      def to_representation(self, instance):return {'id': instance.id,'name': instance.name,'email': instance.email,}
      
  2. to_internal_value(data)

    • 描述: 将原生数据(通常是字典)转换为验证后的数据。
    • 用途: 用于反序列化数据,即将简单的、可序列化的数据类型转换为复杂的数据类型。
    • 示例:
      def to_internal_value(self, data):return {'id': data.get('id'),'name': data.get('name'),'email': data.get('email'),}
      
  3. validate(attrs)

    • 描述: 对输入数据进行验证。
    • 用途: 用于自定义验证逻辑。
    • 示例:
      def validate(self, attrs):if 'email' in attrs and not attrs['email'].endswith('@example.com'):raise serializers.ValidationError("Email must be from the domain 'example.com'.")return attrs
      
  4. create(validated_data)

    • 描述: 使用验证后的数据创建并返回一个新实例。
    • 用途: 用于处理创建操作。
    • 示例:
      def create(self, validated_data):return MyModel.objects.create(**validated_data)
      
  5. update(instance, validated_data)

    • 描述: 使用验证后的数据更新并返回一个现有实例。
    • 用途: 用于处理更新操作。
    • 示例:
      def update(self, instance, validated_data):instance.name = validated_data.get('name', instance.name)instance.email = validated_data.get('email', instance.email)instance.save()return instance
      

常用属性

  1. data

    • 描述: 返回序列化后的数据。
    • 用途: 用于获取序列化后的数据。
    • 示例:
      serializer = MySerializer(instance)
      serialized_data = serializer.data
      
  2. errors

    • 描述: 返回验证错误信息。
    • 用途: 用于获取验证错误信息。
    • 示例:
      serializer = MySerializer(data=request.data)
      if not serializer.is_valid():errors = serializer.errors
      
  3. is_valid(raise_exception=False)

    • 描述: 检查数据是否有效。
    • 用途: 用于验证数据。
    • 示例:
      serializer = MySerializer(data=request.data)
      if serializer.is_valid():# Data is valid
      else:# Data is not valid
      
  4. validated_data

    • 描述: 返回验证后的数据。
    • 用途: 用于获取验证后的数据。
    • 示例:
      serializer = MySerializer(data=request.data)
      if serializer.is_valid():validated_data = serializer.validated_data
      
  5. initial_data

    • 描述: 返回初始化时传入的原始数据。
    • 用途: 用于获取初始化时传入的原始数据。
    • 示例:
      serializer = MySerializer(data=request.data)
      initial_data = serializer.initial_data
      

下面通过一个具体的示例来展示如何在实际应用中使用 BaseSerializer 中的常用方法。假设有一个简单的 Django 模型 Book,我们将创建一个序列化器 BookSerializer 来演示这些方法的实际用法。

模型定义

首先定义一个简单的 Book 模型:

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)published_date = models.DateField()isbn = models.CharField(max_length=13, unique=True)

序列化器定义

接下来定义一个 BookSerializer,并在其中使用 BaseSerializer 的常用方法:

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.Serializer):title = serializers.CharField(max_length=100)author = serializers.CharField(max_length=100)published_date = serializers.DateField()isbn = serializers.CharField(max_length=13)def to_representation(self, instance):"""将模型实例转换为原生 Python 数据类型"""return {'title': instance.title,'author': instance.author,'published_date': instance.published_date,'isbn': instance.isbn,}def to_internal_value(self, data):"""将原生数据转换为验证后的数据"""return {'title': data.get('title'),'author': data.get('author'),'published_date': data.get('published_date'),'isbn': data.get('isbn'),}def validate(self, attrs):"""对输入数据进行验证"""if len(attrs['isbn']) != 13:raise serializers.ValidationError("ISBN must be 13 characters long.")return attrsdef create(self, validated_data):"""使用验证后的数据创建并返回一个新实例"""return Book.objects.create(**validated_data)def update(self, instance, validated_data):"""使用验证后的数据更新并返回一个现有实例"""instance.title = validated_data.get('title', instance.title)instance.author = validated_data.get('author', instance.author)instance.published_date = validated_data.get('published_date', instance.published_date)instance.isbn = validated_data.get('isbn', instance.isbn)instance.save()return instance

例子1

序列化数据

Book 模型实例序列化为 JSON 格式:

from .models import Book
from .serializers import BookSerializer# 假设我们有一个 Book 实例
book_instance = Book.objects.get(id=1)# 序列化
serializer = BookSerializer(book_instance)
serialized_data = serializer.data
print(serialized_data)
反序列化数据

将 JSON 数据反序列化为 Book 模型实例:

from .serializers import BookSerializer# 假设我们有一些 JSON 数据
json_data = {'title': 'New Book','author': 'John Doe','published_date': '2023-10-01','isbn': '1234567890123'
}# 反序列化
serializer = BookSerializer(data=json_data)
if serializer.is_valid():book_instance = serializer.save()print(book_instance)
else:print(serializer.errors)
更新实例

使用验证后的数据更新现有的 Book 实例:

from .models import Book
from .serializers import BookSerializer# 假设我们有一个 Book 实例
book_instance = Book.objects.get(id=1)# 新的数据
update_data = {'title': 'Updated Book','author': 'Jane Doe','published_date': '2023-10-02','isbn': '1234567890123'
}# 更新
serializer = BookSerializer(book_instance, data=update_data)
if serializer.is_valid():updated_instance = serializer.save()print(updated_instance)
else:print(serializer.errors)
验证数据

验证输入数据:

from .serializers import BookSerializer# 一些无效的 JSON 数据
invalid_data = {'title': 'Invalid Book','author': 'John Doe','published_date': '2023-10-01','isbn': '1234567890'  # ISBN 长度不正确
}# 验证
serializer = BookSerializer(data=invalid_data)
if not serializer.is_valid():print(serializer.errors)  # 输出验证错误信息

例子2

好的,下面我将完善这个例子,假设有一个名为 StatPlatProjectData 的模型,并且我们希望在序列化时删除某些字段(如 created_atupdated_atexecutor),将使用 BasicSerializer 作为基类,并在 to_representation 方法中自定义序列化逻辑。

模型定义

首先定义 StatPlatProjectData 模型:

from django.db import modelsclass StatPlatProjectData(models.Model):name = models.CharField(max_length=100)description = models.TextField()executor = models.CharField(max_length=100)created_at = models.DateTimeField(auto_now_add=True)updated_at = models.DateTimeField(auto_now=True)
序列化器定义

接下来定义 StatPlatProjectDataSerializer,并在其中使用 BasicSerializer 的常用方法:

from rest_framework import serializers
from .models import StatPlatProjectDataclass BasicSerializer(serializers.ModelSerializer):passclass StatPlatProjectDataSerializer(BasicSerializer):created_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)updated_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)class Meta:model = StatPlatProjectDatafields = '__all__'def to_representation(self, instance):data = super().to_representation(instance)del_keys = ['created_at', 'updated_at', 'executor']for key in del_keys:data.pop(key, None)return data
序列化数据

StatPlatProjectData 模型实例序列化为 JSON 格式,并删除指定的字段:

from .models import StatPlatProjectData
from .serializers import StatPlatProjectDataSerializer# 假设有一个 StatPlatProjectData 实例
project_data_instance = StatPlatProjectData.objects.get(id=1)# 序列化
serializer = StatPlatProjectDataSerializer(project_data_instance)
serialized_data = serializer.data
print(serialized_data)

在这个例子中,serialized_data 将包含所有字段,除了 created_atupdated_atexecutor

反序列化数据

将 JSON 数据反序列化为 StatPlatProjectData 模型实例:

from .serializers import StatPlatProjectDataSerializer# 假设有一些 JSON 数据
json_data = {'name': 'New Project','description': 'This is a new project.','executor': 'John Doe'
}# 反序列化
serializer = StatPlatProjectDataSerializer(data=json_data)
if serializer.is_valid():project_data_instance = serializer.save()print(project_data_instance)
else:print(serializer.errors)
更新实例

使用验证后的数据更新现有的 StatPlatProjectData 实例:

from .models import StatPlatProjectData
from .serializers import StatPlatProjectDataSerializer# 假设有一个 StatPlatProjectData 实例
project_data_instance = StatPlatProjectData.objects.get(id=1)# 新的数据
update_data = {'name': 'Updated Project','description': 'This is an updated project.','executor': 'Jane Doe'
}# 更新
serializer = StatPlatProjectDataSerializer(project_data_instance, data=update_data)
if serializer.is_valid():updated_instance = serializer.save()print(updated_instance)
else:print(serializer.errors)
验证数据

验证输入数据:

from .serializers import StatPlatProjectDataSerializer# 一些无效的 JSON 数据
invalid_data = {'name': 'Invalid Project','description': 'This is an invalid project.','executor': ''  # executor 不能为空
}# 验证
serializer = StatPlatProjectDataSerializer(data=invalid_data)
if not serializer.is_valid():print(serializer.errors)  # 输出验证错误信息

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Go语言基础--数据类型(布尔、字符串)
  • QT 按钮延时以及滚动条提示
  • centos 下如何安装openjdk21
  • Springboot实现doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频在线预览功能,你学“废”了吗?
  • 【qt】跳转到另一个界面
  • 安全密码算法:SM3哈希算法介绍
  • 电子电气架构---EEA的发展趋势
  • 量化交易的基石:ExchangeSdk
  • (自用)仿写程序
  • 使用 Go 语言将 Base64 编码转换为 PDF 文件
  • 深入探索Amazon EC2:解锁云端计算的无限可能
  • 使用 grep 进行文本文件搜索
  • 网页开发——DOM与BOM
  • watchEffect 函数 与 watch 函数的区别
  • HTTP 请求流程
  • (三)从jvm层面了解线程的启动和停止
  • Android Studio:GIT提交项目到远程仓库
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • JS学习笔记——闭包
  • k8s 面向应用开发者的基础命令
  • React系列之 Redux 架构模式
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 力扣(LeetCode)21
  • 区块链技术特点之去中心化特性
  • 入手阿里云新服务器的部署NODE
  • 学习笔记TF060:图像语音结合,看图说话
  • No resource identifier found for attribute,RxJava之zip操作符
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​浅谈 Linux 中的 core dump 分析方法
  • # Apache SeaTunnel 究竟是什么?
  • # 飞书APP集成平台-数字化落地
  • ###项目技术发展史
  • #70结构体案例1(导师,学生,成绩)
  • #ifdef 的技巧用法
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (2)MFC+openGL单文档框架glFrame
  • (3)llvm ir转换过程
  • (arch)linux 转换文件编码格式
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Java入门)抽象类,接口,内部类
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (八十八)VFL语言初步 - 实现布局
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020