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

news2024/11/23 18:55:57

【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 = GoodsCategory
        fields = ('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 BookSerializer

class 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 models

class 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 Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

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

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

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

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

相关文章

深度学习基本理论

1、MLP、FCN、DNN三者的关系? 多层感知器MLP,全连接网络,DNN三者的关系?三者是不是同一个概念? FCN:Fully Connected Neural Network,全连接神经网络,也称为密集连接神经网络&#…

活动预告l 第二届硬件敏捷开发与验证方法学研讨会

2023年8月23日至25日, 2023 RISC-V中国峰会将在北京香格里拉饭店举办。本届峰会采用“主会议主题活动展览展示同期活动”的会议组织方式,将邀请RISC-V国际基金会、业界专家、企业代表及社区伙伴等共同探讨RISC-V发展趋势与机遇。作为本届RISC-V中国峰会的…

Eureka:集群环境配置

创建三个集群 导包 <!-- 导包--><dependencies><!-- Eureka -server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.…

Jupyter Notebook 配置根目录

注&#xff1a;本文是在 Windows 10 上配置 Jupyter Notebook 打开的默认根目录&#xff0c;Linux 同。 步骤一&#xff1a;创建 Jupyter Notebook 配置文件 使用以下命令创建 Jupyter Notebook 配置文件&#xff08;如果尚未创建&#xff09;&#xff1a; jupyter notebook …

docker优点简介和yum方式安装

一.docker简介 二.docker的优点 1.交付和部署速度快 2.高效虚拟化 3.迁移性和扩展性强 4.管理简单 三.docker的基本概念 1.镜像 2.容器 3.仓库 四.docker的安装部署 &#xff08;1&#xff09;点击容器 ​&#xff08;2&#xff09;选择docker-ce&#xff0c;根据相…

排序算法:选择排序

选择排序的思想是&#xff1a;双重循环遍历数组&#xff0c;每经过一轮比较&#xff0c;找到最小元素的下标&#xff0c;将其交换至首位。 public static void selectionSort(int[] arr) {int minIndex;for (int i 0; i < arr.length - 1; i) {minIndex i;for (int j i …

python rtsp 硬件解码 二

上次使用了python的opencv模块 述说了使用PyNvCodec 模块&#xff0c;这个模块本身并没有rtsp的读写&#xff0c;那么读写rtsp是可以使用很多方法的&#xff0c;我们为了输出到pytorch直接使用AI程序&#xff0c;简化rtsp 输入&#xff0c;可以直接使用ffmpeg的子进程 方法一 …

申请部署阿里云SSL免费证书

使用宝塔自动创建的证书有时候会报NET::ERR_CERT_COMMON_NAME_INVALID&#xff0c;并且每次只能三个月&#xff0c;需要点击续期非常麻烦&#xff0c;容易遗忘。 阿里云免费SSL证书 前往阿里云管理控制台【数字证书管理服务】【SSL证书】&#xff0c;每年20个额度&#xff0c;一…

FPGA原理与结构——时钟资源

一、时钟概述 1、时钟 时钟&#xff0c;即clock信号&#xff0c;是由晶体经过激发产生的振荡电路。模拟端通过各种技术&#xff08;PLL,DPLL&#xff09;产生规律、周期性变化的信号给数字端&#xff0c;数字端使用该信号的边沿进行过赋值&#xff08;procedural assignment&a…

在vue3中创建多重布局的方法

在vue3中创建多重布局的方法 在本文中&#xff0c;会通过demo演示来讲解几个用于创建多重布局的方式。 demo需求&#xff1a;创建一个带有主页、营销页面和应用程序页面的 Web 应用程序 1. 导入Layouts作为常规组件来创建布局系 这是创建布局最简单的方法&#xff0c;但灵活…

ROS-2.ros工具简单认识

ROS命令工具 ros提供了丰富的命令行工具 命令作用rostopic主题相关工具rosservicerosnode节点相关工具rosparam参数相关工具rosmsg消息相关工具rossrv$1 运行小海龟 开启一个终端&#xff0c;启动ros master roscore开启一个终端&#xff0c;启动小海龟仿真器 rosrun tur…

图床项目进度(一)——UI首页

1. 前言 前面我不是说了要做一个图床吗&#xff0c;现在在做ui。 我vue水平不够高&#xff0c;大部分参考b站项目照猫画虎。 vue实战后台 我使用ts&#xff0c;vite&#xff0c;vue3进行了重构。 当然&#xff0c;我对这些理解并不深刻&#xff0c;许多代码都是游离于表面&am…

k8s之Pod及Probe 探针机制(健康检查机制)

文章目录 1、Pod1.1、定义1.2、Pod的形式1.2、Pod的使用1.3、 Pod生命周期1.4、生命周期钩子1.5、临时容器1.5.1、定义1.5.2、使用临时容器的步骤 1.6、静态Pod 2、Probe 探针机制&#xff08;健康检查机制&#xff09;2.1、探针分类2.2、Probe配置项2.3、编写yaml测试探针机制…

初阶c语言:实战项目三子棋

前言 大家已经和博主学习有一段时间了&#xff0c;今天讲一个有趣的实战项目——三子棋 目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 时间戳&#xff1a;推荐一篇 C语言生成随机数的方法_c语言随机数_杯浅…

成为创作者的第512天——创作纪念日

​ &#x1f4da;文章目录 &#x1f4e8;官方致信 &#x1f3af;我的第一篇文章 &#x1f9e9;机缘 &#x1f9e9;收获 &#x1f9e9;成就 &#x1f9e9;憧憬与目标 &#x1f4e8;官方致信 ​ &#x1f3af;我的第一篇文章 2022 年 03 月 26 日&#xff0c;那一天我在C…

【网络安全】防火墙知识点全面图解(一)

防火墙知识点全面图解&#xff08;一&#xff09; 1、什么是防火墙&#xff1f; 防火墙&#xff08;Firewall&#xff09;是防止火灾发生时&#xff0c;火势烧到其它区域&#xff0c;使用由防火材料砌的墙。 后来这个词语引入到了网络中&#xff0c;把从外向内的网络入侵行为看…

nodejs使用PassThrough流进行数据传递合并

在Node.js中&#xff0c;流&#xff08;stream&#xff09;是处理数据的强大工具&#xff0c;它们允许我们以流式方式处理大量数据&#xff0c;而不必一次性将所有数据加载到内存中。PassThrough是Node.js中的一个流类型&#xff0c;它在数据流传递过程中起到 无操作 的中间层&…

LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

设计模式——里氏替换原则

文章目录 里氏替换原则OO 中的继承性的思考和说明基本介绍一个程序引出的问题和思考解决方法 里氏替换原则 OO 中的继承性的思考和说明 继承包含这样一层含义&#xff1a;父类中凡是已经实现好的方法&#xff0c;实际上是在设定规范和契约&#xff0c;虽然它不强制要求所有的…

Web会话技术

会话:用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应 会话跟踪:一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求是否来自于同一浏览器&#xff0c;…