Django之DRF框架三,序列化组件

news2024/10/2 8:42:53

一、序列化类的常用字段和字段参数

常用字段

字段名字段参数
CharFieldmax_length=None, min_length=None, allow_blank=False, trim_whitespace=True
IntegerFieldmax_value=None, min_value=None
FloatFieldmax_value=None, min_value=None
BooleanField
NullBooleanField
FloatFieldmax_value=None, min_value=None
DecimalFieldmax_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None 注:max_digits: 最多位数 decimal_palces: 小数点位置
TimeFieldformat=api_settings.TIME_FORMAT, input_formats=None
DateFieldformat=api_settings.DATE_FORMAT, input_formats=None
DateTimeFieldformat=api_settings.DATETIME_FORMAT, input_formats=None)
EmailFieldmax_length=None, min_length=None, allow_blank=False
RegexFieldregex, max_length=None, min_length=None, allow_blank=False
SlugFieldmax_length=50, min_length=None, allow_blank=False),正则字段,验证正则模式 [a-zA-Z0-9-]+
URLFieldmax_length=200, min_length=None, allow_blank=False
UUIDFieldformat=’hex_verbose’) format: 1) ‘hex_verbose’ 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) ‘hex’ 如 “5ce0e9a55ffa654bcee01238041fb31a” 3)‘int’ - 如: “123456789012312313134124512351145145114” 4)‘urn’ 如: “urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a”
IPAddressFieldprotocol=’both’, unpack_ipv4=False, **options)
DurationField
ChoiceFieldchoices,choices与Django的用法相同
MultipleChoiceFieldchoices
FileFieldmax_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL
ImageFieldmax_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL
ListFieldchild=, min_length=None, max_length=None
DictFieldchild=

常用字段参数

CharField及子类的(EmailField)
反序列化的校验,字段自己的规则

参数含义
max_length最大长度
min_lenght最小长度
allow_blank是否允许为空
trim_whitespace是否截断空白字符

IntegerField

参数含义
max_value最小值
max_value最大值

字段共有参数

参数含义
required表明该字段在反序列化时必须输入,默认True
default反序列化时使用的默认值
allow_null表明该字段是否允许传入None,默认False
validators该字段使用的验证器
error_messages包含错误编号与错误信息的字典
label于HTML展示API页面时,显示的字段名称
help_text用于HTML展示API页面时,显示的字段帮助提示信息
read_only表明该字段仅用于序列化输出,默认False
write_only表明该字段仅用于反序列化输入,默认False

二、序列化高级用法之source(了解)

首先先创建一个django项目,创建book表、publish表、以及author表,并建立三个表之间的关系,完成模型表数据的迁移并录入数据

from django.db import models


# Create your models here.


class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    # 外键字段书与出版社一对多,关联字段在多的一方
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)

    # 书与作者多对多,需要创建中间表,使用全自动创建第三张表
    authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.IntegerField()

在这里插入图片描述

序列化字段名

sourse

  • 可以定制序列化字段名
  • 防止数据被人篡盗,将前端展示的字段名和后端数据的字段名设置成不同的字段名

sourse序列化自有字段和关联字段的区别

1.自有字段,直接写表字段名
publish_name = serializers.CharField(max_length=12, min_length=3, required=True, allow_blank=True,source='name')

2.还可以直接映射方法
models.py
class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)

    def sb_name(self):
        return self.name+'sb'

serializer.py
publish_name = serializers.CharField(max_length=12, min_length=3, required=True, allow_blank=True,source='sb_name')

3.关联字段  通过外键获取
    一对多  一对多的关联,直接点
        publish=serializers.CharField(max_length=8,source='publish.name')
    多对多  source不能用实现定制序列化关联表的字段
        authors = serializers.CharField(source='authors.all')

作业之装饰器

def outer(func):
    def inner(request, *args, **kwargs):
        try:
            request.data = json.loads(request.body)  # 如果json格式不可以序列化loads
        except Exception as e:
            request.data = request.POST
            if request.method == 'PUT':
                body_in = str(request.body, encoding='utf-8')  # 转 译
                body_in = parse.unquote(body_in)
                # request.data = {i.split('=')[0]: i.split('=')[1] for i in body_in.split('&')}  # 字典推导式

                # 笨方法
                d = {}
                sp_1 = body_in.split('&')
                for i in sp_1:
                    k, v = i.split('=')
                    d[k] = v
                request.data = d
        res = func(request, *args, **kwargs)
        return res

    return inner


@outer
def index(request):
    print(request.data)
    return JsonResponse({'code': '请求成功'})

该装饰器只针对视图函数,如果要装饰在类的方法上就需要添加形参中添加self参数

作业之用户一次性提交数据

views.py

from .serializer import AuthorSerializer


class AuthorView(APIView):
    def post(self, request):
        ser = AuthorSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': '创建成功'})
        else:
            return Response({'code': 100, 'msg': ser.errors})
serializer.py

class AuthorSerializer(serializers.ModelSerializer):
    telephone = serializers.CharField()
    birthday = serializers.CharField()
    addr = serializers.CharField()

    class Meta:
        model = Author
        fields = ['name', 'age', 'telephone', 'birthday', 'addr']

    def create(self, validated_data):  # 因为author表里没有authordetail其它三个字段,需要重写
        telephone = validated_data.pop('telephone')
        birthday = validated_data.pop('birthday')
        addr = validated_data.pop('addr')

        # 先创建作者详情,在创建作者,因为外键字段的约束,是现有作者详情,再有作者约束
        author_detail = AuthorDetail.objects.create(telephone=telephone, birthday=birthday, addr=addr)
        validated_data['author_detail'] = author_detail
        author = Author.objects.create(**validated_data)

        return author

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

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

相关文章

基于Python的音乐数据可视化与推荐系统开发

基于Python的音乐数据可视化与推荐系统开发 导言: 音乐是人们生活中不可或缺的一部分,而对于音乐数据的收集、分析和可视化正逐渐成为技术领域的热点。本文介绍了一款基于Python开发的音乐数据可视化与推荐系统,通过爬取千千音乐网站的数据&a…

C# 实现虚拟数字人

随着Ai技术的提升和应用,虚拟数字人被广泛应用到各行各业中。为我们的生活和工作提供了非常多的便利和色彩。 通过设置虚拟数字人的位置大小,可以让数字人可以在电脑屏幕各个位置显示: 虚拟数字人素材: 虚拟数字人(实际有语音&am…

双向A*算法-python

GitHub - LittleFox99/B_A_star: Bidirectional A Star 其中a,b分别为双向A*搜索的权重 #-*- coding:utf-8 -*- # Time : 2020/11/11 1:21 下午 # Author : LittleFox99 # File : a_star.py # 参考: # https://blog.csdn.net/lustyoung/article/d…

前缀和+单调双队列+贪心:LeetCode2945:找到最大非递减数组的长度

本文涉及知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 单调双队列 贪心 题目 给你一个下标从 0 开始的整数数组 nums 。 你可以执行任意次操作。每次操作中,你需要选择一个 子数组 ,并将这个子数组用它所…

资深13年测试整理,性能测试指标-评估方法,一篇搞懂...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、软件性能的关注…

深入探讨DNS数据包注入与DNS中毒攻击检测 (C/C++代码实现)

DNS数据包注入和DNS中毒攻击是网络安全领域中的两个重要主题。DNS(域名系统)是互联网中的一项核心服务,负责将域名转换为与之相对应的IP地址。 DNS数据包注入是指攻击者通过篡改或伪造DNS请求或响应数据包来干扰或破坏DNS服务的过程。攻击者…

webots仿真报警[ERROR] [1703399199.459991029]: Sampling period is not valid.

一、故障现象 在运行interace传感器使能程序时,报警[ERROR] [1703399199.459991029]: Sampling period is not valid. [ERROR] [1703399199.460080083]: Failed to enable lidar.并发生崩溃。 二、解决方式 1、尝试将程序中的TIME_STEP数值改为与WOrldInfo中的bas…

LeetCode 1954. 收集足够苹果的最小花园周长

一、题目 1、题目描述 给你一个用无限二维网格表示的花园,每一个 整数坐标处都有一棵苹果树。整数坐标 (i, j) 处的苹果树有 |i| |j| 个苹果。 你将会买下正中心坐标是 (0, 0) 的一块 正方形土地 ,且每条边都与两条坐标轴之一平行。 给你一个整数 need…

Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记

Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记 Abstract 无人机在各种应用中得到了广泛使用,例如航拍和军事安全,这得益于它们与固定摄像机相比的高机动性和广阔视野。多无人机追踪系统可以通过从不同视角收集互补的…

红日靶场-2

目录 前言 外网渗透 外网渗透打点 1、arp探测 2、nmap探测 3、nikto探测 4、gobuster目录探测 WebLogic 10.3.6.0 1、版本信息 2、WeblogicScan扫描 3、漏洞利用 4、哥斯拉连接 内网渗透 MSF上线 1、反弹连接 2、内网扫描 3、frpc内网穿透 4、ms17-010 5、ge…

【测试开发】测试用例讲解

文章目录 目录 文章目录 前言 一、测试用例的基本要素 二、测试用例的设计方法 1.基于需求的设计方法 对日历根据web界面的功能布局分析出的功能框图如下: 继续举一个例子百度云盘非功能测试的案例: 2.等价类 3.边界值 5.正交表 6.场景设计法 7…

什么等等? I/O Wait ≠ I/O 瓶颈?

本文地址:什么等等? I/O Wait ≠ I/O 瓶颈? | 深入浅出 eBPF 1. I/O Wait 定义2. 测试验证3. 进一步明确磁盘吞吐和读写频繁进程4. 内核 CPU 统计实现分析5. 总结参考资料 1. I/O Wait 定义 I/O Wait 是针对单个 CPU 的性能指标&#xff0…

使用Python实现发送Email电子邮件【第19篇—python发邮件】

文章目录 👽使用Python实现发送Email电子邮件🎶实现原理🏃Python实现发送Email电子邮件-基础版👫实现源码🙆源码解析 💇Python实现发送Email电子邮件-完善版👫实现源码🙆源码解析&am…

【贪心】单源最短路径Python实现

文章目录 [toc]问题描述Dijkstra算法Dijkstra算法应用示例时间复杂性Python实现 个人主页:丷从心 系列专栏:贪心算法 问题描述 给定一个带权有向图 G ( V , E ) G (V , E) G(V,E),其中每条边的权是非负实数,给定 V V V中的一个…

婚庆婚礼策划服务网站建设的效果如何

品牌效应越来越重要,婚庆行业在多年的发展下,部分区域内也跑出了头部品牌,连锁门店也开了很多家,无论新品牌还是老品牌在新的区域开店总归少不了线上线下的宣传,虽然几乎每个人都会接触婚庆服务,但因为市场…

HarmonyOS构建第一个JS应用(FA模型)

构建第一个JS应用(FA模型) 创建JS工程 若首次打开DevEco Studio,请点击Create Project创建工程。如果已经打开了一个工程,请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&#xf…

操作系统——进程管理算法和例题

1、概述 1.1 进程调度 当进程的数量往往多于处理机的个数,出现进程争用处理机的现象,处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、髙效)选择一个进程并将处理机分配给它运行&am…

各种边缘检测算子的比较研究

边缘检测算子比较研究 文章目录 边缘检测算子比较研究一、引言1.1 边缘检测的重要性1.2 研究背景与意义1.3 研究目的和论文结构 二、文献综述2.1 边缘检测概述2.2 Roberts、Prewitt、Sobel、Laplacian 和 Canny 算子的理论基础和历史2.2.1 **Roberts算子:**2.2.2 **…

给定一个数列,每一次操作可以使a[i]变成x,y,满足x + y = a[i] + k, 求使所有数字相同的最少操作次数

题目 思路&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long const int maxn 2e5 5; int a[maxn], b[maxn], c[maxn]; void solve(){int n, k;cin >> n >> k;int g 0;for(int i 1; i < n; i){cin >> a[i];a[i] …

“FPGA+MDIO总线+UART串口=高效读写PHY芯片寄存器!“(含源代码)

1、概述 前文对88E1518芯片的端口芯片及原理图进行了讲解&#xff0c;对MDIO的时序也做了简单的讲解。本文通过Verilog HDL去实现MDIO&#xff0c;但是88E1518芯片对不同页的寄存器读写需要切换页&#xff0c;无法直接访问寄存器&#xff0c;如果通过代码读写某些固定寄存器的话…