【Django】Task4 序列化及其高级使用、ModelViewSet

【Django】Task4 序列化及其高级使用、ModelViewSet

Task4主要了解序列化及掌握其高级使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视图。
在这里插入图片描述

1.Django的序列化

Django 的序列化是指将复杂的数据结构(通常是数据库中的模型对象)转换为可以在不同应用程序间传输和存储的格式,如 JSON、XML 或类似的格式。这使得数据可以在不同系统、平台或前后端之间进行交换和共享。

在 Django 中,序列化主要用于处理以下两个场景:

数据交换和传输: 当您需要在应用程序的不同部分之间传递数据时,例如在后端和前端之间,或在不同的服务之间,您可以将数据序列化为一种通用格式,如 JSON。这样,数据可以在不同系统之间传输和解析。

API 响应: 在开发 Web API 时,您通常会需要将数据库中的数据转换为特定的数据格式(如 JSON),以便客户端可以轻松地消费数据。这就涉及到将 Django 模型对象序列化为 JSON 或其他格式,然后将其返回给客户端。

Django 提供了一个内置的序列化框架,称为 Django REST framework(DRF),它是一个功能强大的工具,用于处理序列化和反序列化。使用 DRF,您可以轻松地将 Django 模型转换为 JSON 格式,或者从 JSON 格式反序列化回模型对象。

1.1序列化常用到的参数

在 Django REST framework 中,进行序列化时,常用的一些参数可以用来控制序列化的行为和输出。以下是一些常用的序列化参数:

fields: 用于指定要序列化的字段列表。您可以选择性地列出要包含在序列化输出中的字段。

exclude: 与 fields 相反,用于指定不包含在序列化输出中的字段列表。

read_only_fields: 用于指定在反序列化(从 JSON 到模型对象)时不允许更新的字段列表。这些字段只能在创建时指定,之后不能更改。

write_only_fields: 与 read_only_fields 相反,用于指定在序列化(从模型对象到 JSON)时不包含在输出中的字段列表。这些字段只用于接收输入。

validators: 用于指定字段级别的验证器列表,这些验证器会在序列化和反序列化过程中执行。

extra_kwargs: 允许您为特定字段提供附加参数,例如指定自定义验证器或者控制序列化行为。

many: 用于指示是否进行批量序列化。如果为 True,则序列化器将在序列化多个对象时执行批量操作。

allow_null: 用于指示是否允许序列化字段的值为 None,默认为 False。

required: 用于指示字段是否为必填字段,如果为 True,则在反序列化时必须提供该字段的值。

default: 用于指定字段的默认值,在反序列化时,如果未提供该字段的值,将使用默认值。

source: 用于指定要从模型中获取数据的字段名称。如果序列化器的字段名称与模型字段名称不同,可以使用该参数来指定模型字段的名称。

label: 用于指定字段在序列化输出中的标签,用于更友好的展示字段名称。

这只是一些常见的序列化参数,Django REST framework 提供了丰富的选项和配置,以满足不同的序列化需求。您可以根据具体的情况选择适当的参数来定制您的序列化器。

1.2序列化示例

以下是一个简单的示例,说明如何使用 DRF 进行序列化:

  • serializer.py
# 定义产品序列化器
from rest_framework.serializers import *
from .models import *# 产品分类序列化器
class GoodsCategorySerializer(ModelSerializer):class Meta:model = GoodsCategoryfields = ('name', 'remark')# 产品序列化器
class GoodsSerializer(ModelSerializer):# 外键字段相关的数据 需要单独序列化category = GoodsCategorySerializer()class Meta:model = Goods# 序列化单个字段fields = ('name',)# 序列化多个字段fields = ('name','number',)# 序列化所有字段fields = '__all__'

在这个示例中,我们定义了名为 GoodsCategorySerializer、GoodsSerializer 的序列化器,用于将 GoodsCategory、Goods 模型转换为 JSON 格式。通过 serializers.ModelSerializer 类,我们可以很方便地将模型字段映射到序列化器的字段,并使用 Meta 类来指定要序列化的模型和字段。

总之,Django 的序列化是将复杂的数据转换为通用数据格式的过程,用于数据交换、API 响应等场景。Django REST framework 提供了强大的序列化框架,使数据的转换和传输变得更加简便。

  • views.py
from django.shortcuts import render
from rest_framework.response import Response
from .models import *
from rest_framework.decorators import api_view
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from .serializer import *class GetGoods(APIView):def get(self, request):data = Goods.objects.all()serializer = GoodsSerializer(instance=data, many=True)print(serializer.data)return Response(serializer.data)def post(self, request):# 从请求数据中提取字段request_data = {"category": request.data.get("Goodscategory"),"number": request.data.get("number"),"name": request.data.get("name"),"barcode": request.data.get("barcode"),"spec": request.data.get("spec"),"shelf_life_days": request.data.get("shelf_life_days"),"purchase_price": request.data.get("purchase_price"),"retail_price": request.data.get("retail_price"),"remark": request.data.get("remark"),}# 使用 create() 方法创建新的商品对象new_goods = Goods.objects.create(**request_data)# 对创建的对象进行序列化,并作为响应返回serializer = GoodsSerializer(instance=new_goods)return Response(serializer.data)
  • urls.py
from django.contrib import admin
from django.urls import path
from apps.erp_test.views import *urlpatterns = [path('admin/', admin.site.urls),path('getgoods/', GetGoods.as_view()),
]

1.3序列化单个对象

#获取对象 
data = Goods.objects.get(id=1)​#创建序列化器 
sberializer = GoodsSerializer(instance=data)​#转换数据 
print(serializer.data)

注意点:

​instance​是一个参数,用于指定要序列化或反序列化的 Python 对象。具体来说,它是一个类实例(Class Instance),通常是指一个从数据库或其他数据源中检索出来的模型实例(Model Instance)。

当我们需要将一个模型实例转换为 JSON 或其他格式时,可以使用 Django 的序列化器(Serializer)来实现。

1.4序列化多个对象

data = Goods.objects.all() # 获取对象# 创建序列化器,many表示序列化多个对象,默认为单个
serializer = GoodsSerializer(instance=data,many=True)print(serializer.data) # 转换数据# 输出:
[OrderedDict([('id', 1), ('number', '1'), ('name', '第一个产品'), ('purchase_price', 100.0), ('retail_price', 150.0), ('remark', '测试产品')]), OrderedDict([('id', 2), ('number', '123'), ('name', '产品2'), ('purchase_price', 123.0), ('retail_price', 4123.0), ('remark', '测试产品2')])]  

2.Django的ModelViewSet

ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视图。它提供了一组默认的 CRUD(创建、读取、更新、删除)操作,可以用于操作 Django 模型中的数据。

ModelViewSet 通过将常见的 API 操作封装到一个类中,使得编写 API 视图变得更加简洁和方便。它继承自 DRF 中的 GenericAPIView,并结合了 ListModelMixin、CreateModelMixin、RetrieveModelMixin、UpdateModelMixin 和 DestroyModelMixin,从而提供了一系列用于处理模型数据的默认操作。

2.1ModelViewSet示例

以下是一个使用 ModelViewSet 的简单示例:

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer

在这个示例中,假设有一个名为 Book 的模型和相应的序列化器 BookSerializer。通过创建一个继承自 ModelViewSet 的 BookViewSet 类,您可以自动获得以下操作:

知识点请求url特点
GenericViewSet提供一组通用的视图方法,方便实现特定功能
ListModelMixinget127.0.0.1:8000/book/提供 list​ 方法,用于获取资源列表
RetrieveModelMixinget127.0.0.1:8000/book/{1}/提供 retrieve​ 方法,用于获取单个资源的详细信息
CreateModelMixinpost127.0.0.1:8000/book/提供 create​ 方法,用于创建资源
UpdateModelMixinput127.0.0.1:8000/book/{1}/提供 update​ 方法,用于更新资源
DestroyModelMixindetete127.0.0.1:8000/book/{1}/提供 destroy​ 方法,用于删除资源
自定义get/post127.0.0.1:8000/book/自定义用户自定义方法/函数

这些技术知识点可以配合使用,帮助我们快速构建出具有 CRUD 功能的 Web 应用,并且遵循了 Django 框架的惯例和最佳实践。它们的应用场景包括博客系统、电商平台、社交网络等各种类型的 Web 应用。通过使用这些技术知识点,我们能够提高开发效率,减少重复的代码编写工作,并且保证代码的一致性和可维护性。

列出所有图书:GET 请求将返回所有图书的列表。
创建新图书:POST 请求将创建一个新的图书。
获取单个图书:GET 请求将返回指定图书的详细信息。
更新图书:PUT 或 PATCH 请求将更新指定图书的信息。
删除图书:DELETE 请求将删除指定图书。
ModelViewSet 还允许您通过覆盖一些方法来自定义行为,例如覆盖 get_queryset() 来定义自己的查询集,或者覆盖 perform_create() 来在创建对象时执行自定义操作。

总之,ModelViewSet 是 Django REST framework 中的一个有用的工具,用于快速创建处理模型数据的 API 视图,并且提供了一系列默认操作,减少了繁琐的代码编写。

补充上述图书curd中的Book模型和序列化器
定义 Book 模型:

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=200)author = models.CharField(max_length=100)publication_date = models.DateField()isbn = models.CharField(max_length=13)def __str__(self):return self.title

与 Book 模型对应的序列化器 BookSerializer:

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'

在这个示例中,我们创建了一个名为 Book 的模型,其中包含了一些基本的字段,如标题、作者、出版日期和 ISBN 号。然后,我们创建了一个 BookSerializer,使用 serializers.ModelSerializer 类来定义序列化器。在 Meta 类中,我们将模型设置为 Book,并使用 fields = ‘all’ 来指定所有模型字段都会被包含在序列化输出中。

通过这样的设置,可以使用 BookSerializer 来序列化和反序列化 Book 模型的数据,从而在 API 视图中进行数据的展示和操作。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 网络编程项目fastDFS分布式文件系统(四)-fastCGI项目相关技术以及linux搜狗输入法相关问题。

目录 1. Nginx作为web服务器处理请求 2. http协议复习 Get方式提交数据 Post方式提交数据 3. fastCGI 3.1 CGI 3.2 fastCGI 3.3 fastCGI和spawn-fcgi安装 1. 安装fastCGI 2. 安装spawn-fcgi 3.4 nginx && fastcgi 4其他知识点 1. fastCGI环境变量 - fas…

滑动验证码-elementui实现

使用elementui框架实现 html代码 <div class"button-center"><el-popoverplacement"top":width"imgWidth"title"安全验证"trigger"manual"v-model"popoverVisible"hide"popoverHide"show&quo…

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势: 斯波克:《星际迷航》主…

FairyGUI编辑器自定义菜单扩展插件

本文涉及到的软件有&#xff1a;FairyGUI&#xff0c;VSCode 代码环境涉及到了&#xff1a;Lua VSCode插件&#xff1a;EmmyLua 在编写FairyGUI编辑器菜单前&#xff0c;了解一下FairyGUIEditor的API会有效的帮助我们解决很多问题。FairyGUI的扩展是通过编辑器自带的插件功能…

面试-快速学习计算机网络-UDP/TCP

1. OSI四层和七层映射 区别&#xff1a; 应用层&#xff0c;表示层&#xff0c;会话层合并为了应用层数据链路层和物理层合并为了网络接口层 2. TCP和UDP的区别&#xff1f; 总结&#xff1a; 1 . TCP 向上层提供面向连接的可靠服务 &#xff0c;UDP 向上层提供无连接不可靠服…

Lnton羚通算法算力云平台在环境配置中Windows10终端和VSCode下如何打开Anaconda-Prompt

在Windows 10的终端和VSCode中&#xff0c;可以直接打开Anaconda Prompt。下面是两种方法&#xff1a; Windows 10终端&#xff1a;在开始菜单中搜索"Anaconda Prompt"&#xff0c;然后点击打开。这将启动Anaconda Prompt终端&#xff0c;你可以在其中执行conda相关命…

2337. 移动片段得到字符串

题目描述&#xff1a; 给你两个字符串 start 和 target &#xff0c;长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成&#xff0c;其中&#xff1a; 字符 ‘L’ 和 ‘R’ 表示片段&#xff0c;其中片段 ‘L’ 只有在其左侧直接存在一个 空位 时才能向 左 移动&a…

通过Matlab编程分析微分方程、SS模型、TF模型、ZPK模型的关系

微分方程、SS模型、TF模型、ZPK模型的关系 一、Matlab编程 微分方程、SS模型、TF模型、ZPK模型的关系二、对系统输出进行微分计算三、对系统输出进行积分计算四、总结五、系统的零点与极点的物理意义参考 &#xff1a;[https://www.zhihu.com/question/22031360/answer/3073452…

SpringCloud Gateway服务网关的介绍与使用

目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route&#xff08;路由&#xff09;3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…

ubuntu 20.04 安装 高版本cuda 11.7 和 cudnn最新版

一、安装显卡驱动 参考另一篇文章&#xff1a;Ubuntu20.04安装Nvidia显卡驱动教程_ytusdc的博客-CSDN博客 二、安装CUDA 英伟达官网&#xff08;最新版&#xff09;&#xff1a;CUDA Toolkit 12.2 Update 1 Downloads | NVIDIA Developer CUDA历史版本下载地址&#xff1a;C…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

统一git使用方法,git状态变迁图,git commit提交规范

目录 说明 统一git使用方法 git状态变迁图 git commit 提交规范 说明 多次工作中多名员工不懂git多次技术分享&#xff0c;自行查资料学习git并使用&#xff0c;会出现使用各种偏僻的命令&#xff0c;异常问题无法解决&#xff1b;或出现带url的git合并提交。主要是学的不…

EasyPOI 实战总结

EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…

2022年06月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;制作蛋糕 小A擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要2个单位的香蕉&#xff0c;250个单位的面粉&#xff0c;75个单位的糖&#xff0c;100个单位的黄油。制作一个巧克力蛋糕需要75个单位的可可粉&#xff0c;200个单位的面粉&#xff0c;150个单…

Docker的数据管理及端口映射与容器互联(使用centos镜像)

目录 Docker数据管理 1&#xff0e;数据卷 2&#xff0e;数据卷容器 Docker端口映射 Docker容器互联 Docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&…

蓝凌OA custom.jsp 任意文件读取

​曾子曰&#xff1a;“慎终追远&#xff0c;民德归厚矣。” 漏洞复现 访问漏洞url&#xff1a; 出现漏洞的文件为 custom.jsp&#xff0c;构造payload&#xff1a; /sys/ui/extend/varkind/custom.jsp var{"body":{"file":"file:///etc/passwd&q…

vue2+element-ui+springboot编写一个简单的CRUD和上传页面

1.0先看效果图 2.0主功能页面展示 3.0新增功能 4.0更新功能 5.0接口错误提示 前端码云链接:https://gitee.com/xiaojianr/management/tree/master/ 前端拷贝完成需要使用:npm install 命令完成package.json依赖的下载 后端码云链接:https://gitee.com/xiaojianr/manage

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…

Blend for Visual Studio:提升用户界面设计的专业工具

随着软件行业的迅速发展&#xff0c;用户界面设计变得越来越重要。一个好的用户界面能够吸引用户的注意力&#xff0c;提供良好的用户体验&#xff0c;并增加应用程序的成功率。在这个背景下&#xff0c;Blend for Visual Studio作为一款专业的用户界面设计工具&#xff0c;为开…

基于PaddleOCR2.7.0发布WebRest服务测试案例

基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告&#xff1a;这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…