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

这篇具有很好参考价值的文章主要介绍了【Django】Task4 序列化及其高级使用、ModelViewSet。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Task4主要了解序列化及掌握其高级使用,了解ModelViewSet的作用,ModelViewSet 是 Django REST framework(DRF)中的一个视图集类,用于快速创建处理模型数据的 API 视图。
【Django】Task4 序列化及其高级使用、ModelViewSet,django,数据库,sqlite

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 提供一组通用的视图方法,方便实现特定功能
ListModelMixin get 127.0.0.1:8000/book/ 提供 list​ 方法,用于获取资源列表
RetrieveModelMixin get 127.0.0.1:8000/book/{1}/ 提供 retrieve​ 方法,用于获取单个资源的详细信息
CreateModelMixin post 127.0.0.1:8000/book/ 提供 create​ 方法,用于创建资源
UpdateModelMixin put 127.0.0.1:8000/book/{1}/ 提供 update​ 方法,用于更新资源
DestroyModelMixin detete 127.0.0.1:8000/book/{1}/ 提供 destroy​ 方法,用于删除资源
自定义 get/post 127.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 视图中进行数据的展示和操作。文章来源地址https://www.toymoban.com/news/detail-665952.html

到了这里,关于【Django】Task4 序列化及其高级使用、ModelViewSet的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django REST Framework入门之序列化器

    Django REST framework (简称:DRF)是一个强大而灵活的 Web API 工具。遵循RESTFullAPI风格,功能完善。 能简化序列化及开发REST API视图的代码,大大提高REST API的开发速度;提供灵活的路由API,内置了强大的认证和授权机制 Django REST framework 最新版使用要求 在settings.py文件的INSTALLED_

    2024年01月21日
    浏览(44)
  • Django REST framework中的序列化Serializers

    序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。 简单来说,服务器通过api 返回数据(json格

    2024年02月09日
    浏览(34)
  • django rest_framework 框架动态设置序列化返回的字段

    动态修改字段可以使Django rest框架API像graphQL端点一样,只从模型中检索所需的字段。 一旦序列化器被初始化,就可以使用.fields属性访问序列化器上设置的字段字典。访问和修改此属性允许您动态修改序列化器。 显式地修改fields参数可以帮助您做一些奇怪的事情,例如在运行

    2024年02月16日
    浏览(51)
  • 由Django-Session配置引发的反序列化安全问题

    漏洞成因位于目标配置文件settings.py下 关于这两个配置项 SESSION_ENGINE: 在Django中, SESSION_ENGINE  是一个设置项,用于指定用于存储和处理会话(session)数据的引擎。 SESSION_ENGINE  设置项允许您选择不同的后端引擎来存储会话数据,例如: 数据库后端  ( django.contrib.sessions.b

    2024年02月08日
    浏览(50)
  • Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测

    2024年02月16日
    浏览(46)
  • Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(十)自定义action names【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测试的喵酱的博

    2024年02月16日
    浏览(43)
  • Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】

    上一章: Django实现接口自动化平台(七)数据库设计_做测试的喵酱的博客-CSDN博客 下一章: 官方文档: Serializers - Django REST framework apps/reports/serializers.py 1.1.1 代码解释: 1、  exclude: You can set the  exclude  attribute to a list of fields to be excluded from the serializer. For example: 2、read_o

    2024年02月09日
    浏览(47)
  • Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】

    相关文章: Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测

    2024年02月17日
    浏览(44)
  • JavaEE 初阶篇-深入了解 I/O 高级流(缓冲流、交换流、数据流和序列化流)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 缓冲流概述         1.1 缓冲流的工作原理         1.2 使用缓冲流的步骤         1.3 字节缓冲流于字符缓冲流的区别         1.4 字节缓冲流的实例         1.5 字符缓冲流的实例

    2024年04月29日
    浏览(51)
  • Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】

    上一章: Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue httprunner 实现接口自动化平台(最终版)_python+vue自动化测试平台_做测

    2024年02月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包