• 【Django 04】Serialization 序列化的高级使用


    序列化器 serializers

    序列化器的作用

    序列化将 querysetinstance 转换为 json/xml/yaml 返回给前端
    反序列化与序列化则相反

    定义序列化器

    定义类,继承自 Serializer

    通常新建一个 serializers.py 文件 撰写序列化内容

    suah as 目前只支持

    read_only 只读

    label 字段说明信息

    max_length 最大长度

    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__'
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    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('filtergoodscategory/', FilterGoodsCategory),
        path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
        path('getgoods/', GetGoods.as_view()),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    a. 序列化单个对象

    • 获取对象 data = Goods.objects.get(id=1)

    • 创建序列化器 sberializer = GoodsSerializer(instance=data)

    • 转换数据 print(serializer.data)

    • 注意点:

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

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

    • 输出:

    {
    	"id": 1,
    	"number": "1",
    	"name": "第一个产品",
    	"purchase_price": 100.0,
    	"retail_price": 150.0,
    	"remark": "测试产品"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    b. 序列化多个对象

    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')])]  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    数据库中间件
    spring详解(一)
    高压放大器基于声纹影法的声可视化实验的应用
    docker常用命令大全
    能带你起飞的【数据结构】成王第九篇:二叉树2
    Leetcode (ok)167 11 (思路) 35 74 (*) 162 33 34 153
    Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
    深入学习NumPy库在数据分析中的应用场景
    还在发愁PPT该怎么设计?看看这几个网站
    Spring全家桶 源码 入门系列(一) --------容器与 bean
  • 原文地址:https://blog.csdn.net/weixin_42322991/article/details/133966922