【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.mzph.cn/news/47120.shtml

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

相关文章

数据仓库一分钟

数据分层 一、数据运营层:ODS(Operational Data Store) “面向主题的”数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的 ETL…

电信不提供公网IP怎么解决?快解析内网穿透解决方案

由于现在电信运营商的政策调整,加上受到网络服务架构的影响,一些用户在使用宽带连接时,往往会遇到电信不提供公网IP的情况。这种情况下,我们可能会受到一些限制,特别是对于需要对外提供服务或进行远程访问的场景而言&a…

使用ChatGPT-4优化编程效率:高效查询代码示例和解决方案

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

Linux下的thundersvm的安装经验

之前写过一篇文章是关于windows下安装thundersvm的。当初在linux下安装thundersvm很容易,因为我的CUDA正好是9.0版本。所以一句命令 pip install thundersvm 即可安装。 但如果CUDA版本不是9.0,安装就比较麻烦。本文记录的是一种可行的方法,但…

LVS+Keepalived 实验

Keepalived 是什么 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题的一款检查工具 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器…

Git标签

Git 中的标签,指的是某个分支某个特定时间点的状态(静态)。通过标签,可以很方便的切换到标记时的状态。 比较有代表性的是人们会使用这个功能来标记发布结点 (v1.0、v1.2等)。 下面是myatis-plus的标签: 1 标签相关命令 命令作用git tag查看标签&…

python中(限小白,大佬勿入)python开发中的trick:常量

开场白 我是小白,今天被前端骂了一顿:我们交接不是说好了就给你四个变量:A,B。C。D。你这命名的这么具体,我这边给你传值不是很方便啊(因为不同模块有复用的图片路径),我说“那我改&…

自动化测试工具Selenium的语法续.

OK,那么上篇博客我们介绍了如何搭建基于Javaselenium的环境,并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例,那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法,感谢关注,期待三连~ 目…

陕西广电 HG6341C FiberHome烽火 光猫获取超级密码 改桥接模式 提升网速

光猫默认的路由模式实测在100M宽带下只能跑到60M左右,只有改成桥接模式才能跑满,不损失性能。但是改桥接需要给运营商打电话,有的时候不想麻烦他们,这时获取超级密码进行更改就是一个不错的选择了 分析 之前写了一篇HGU B2 光猫的…

CSS和AJAX阶段学习记录

1、AJAX的工作原理: 如图所示,工作原理可以分为以下几步: 网页中发生一个事件(页面加载、按钮点击) 由 JavaScript 创建 XMLHttpRequest 对象 XMLHttpRequest 对象向 web 服务器发送请求 服务器处理该请求 服务器将响应…

音视频技术开发周刊 | 307

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 “视象新生”火山引擎视频云&AIGC技术大会邀你踏入新“视界” 8月22日,火山引擎视频云&AIGC技术大会即将开启!本次大会以“视象新生”为主…

第 359 场 LeetCode 周赛题解

A 判别首字母缩略词 签到题… class Solution { public:bool isAcronym(vector<string> &words, string s) {string pf;for (auto &s: words)pf.push_back(s[0]);return pf s;} };B k-avoiding 数组的最小总和 贪心&#xff1a;从 1 1 1开始升序枚举&#xff0c…

第七次作业 运维高级 docker容器进级版

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 (1)拉取相应镜像 docker pull mysq:5.6 docker pull owncloud:latest(2)运行mysql&#xff1a;5.6容器 docker run --name mysql -e MYSQL_ROOT_PASSWORD12345 -d mysql:5.6(3)运行owncloud容器 docker run…

如何安装指定版本node.js,安装旧版本node

1、查看当前是否安装node&#xff0c;如果安装了需要先卸载当前版本node 搜索控制面板 -> 找到程序/卸载程序 -> 在里面找到node -> 然后右击卸载 2、卸载完成后就要安装其他版本得node.js 找到想要安装的对应版本&#xff0c;安装.msi格式的安装包 注&#xff…

华为云开发工具CodeArts IDE for C/C++ 开发使用指南

简介 CodeArts IDE是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了开发语言和调试服务。本文主要介绍CodeArts IDE for C/C的基本功能。 1.下载安装 CodeArts IDE for C/C 已开放公测&#xff0c;下载获取免费体验 2.新建C/C工程 CodeArts IDE for C/…

AUTOSAR规范与ECU软件开发(实践篇)5.1 ETAS ISOLAR-A工具简介

前言 如前所述, 开发者可以先在系统级设计工具ISOLAR-A中设计软件组件框架, 包括端口接口、 端口等, 即创建各软件组件arxml描述性文件; 再将这些软件组件描述性文件导入到行为建模工具, 如Matlab/Simulink中完成内部行为建模。 亦可以先在行为建模工具中完成逻辑建模, 再…

分布式核心知识

文章目录 前言一、分布式中的远程调用1.1RESTful接口1.2RPC协议1.3区别与联系 二、分布式中的CAP原理 前言 关于分布式核心知识详解 一、分布式中的远程调用 在微服务架构中&#xff0c;通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分&#xff1a;序列化和通…

JVM详解

文章目录 一、JVM 执行流程二、类加载三、双亲委派模型四、垃圾回收机制&#xff08;GC&#xff09; 一、JVM 执行流程 程序在执行之前先要把java代码转换成字节码&#xff08;class文件&#xff09;&#xff0c;JVM 首先需要把字节码通过一定的方式 类加载器&#xff08;Clas…

Python“牵手”拼多多商品评论数据采集方法,拼多多API申请步骤说明

拼多多平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;拼多多API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问拼多多平台的数据&#xff0c;包括商品信息、店铺信息、物流信息&#xff0c;评论数据等&a…

推荐一款好用的开源视频播放器(免费无广告)

mpv是一个自由开源的媒体播放器&#xff0c;它支持多种音频和视频格式&#xff0c;并且具有高度可定制性。mpv的设计理念是简洁、高效和功能强大。 软件特点&#xff1a; 1. 开源、跨平台。可以在Windows\Linux\MacOS\BSD等系统上使用&#xff0c;完全免费无广告。Windows版解压…