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

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

常用字段

字段名字段参数
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格式不可以序列化loadsexcept Exception as e:request.data = request.POSTif 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] = vrequest.data = dres = func(request, *args, **kwargs)return resreturn inner@outer
def index(request):print(request.data)return JsonResponse({'code': '请求成功'})该装饰器只针对视图函数,如果要装饰在类的方法上就需要添加形参中添加self参数

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

views.pyfrom .serializer import AuthorSerializerclass 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.pyclass AuthorSerializer(serializers.ModelSerializer):telephone = serializers.CharField()birthday = serializers.CharField()addr = serializers.CharField()class Meta:model = Authorfields = ['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_detailauthor = Author.objects.create(**validated_data)return author

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

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

相关文章

零基础学人工智能:TensorFlow 入门例子

识别手写图片 因为这个例子是 TensorFlow 官方的例子,不会说的太详细,会加入了一点个人的理解,因为TensorFlow提供了各种工具和库,帮助开发人员构建和训练基于神经网络的模型。TensorFlow 中最重要的概念是张量(Tenso…

基于Java SSM框架实现学生综合考评作业成绩管理系统项目【项目源码+论文说明】

基于java的SSM框架实现学生综合考评作业成绩管理系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 学生综合考评管理系统,主要的模块包括查看;管理员&#xff1…

互联网上门洗衣洗鞋小程序优势有哪些?

互联网洗鞋店小程序相较于传统洗鞋方式,具有以下优势; 1. 便捷性:用户只需通过手机即可随时随地下单并查询,省去了许多不必要的时间和精力。学生们无需走出宿舍或校园,就能轻松预约洗鞋并取件。 2. 精准定位&#xff1…

第26关 K8s日志收集揭秘:利用Log-pilot收集POD内业务日志文件

------> 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。 OK,到目前为止,我们的服务顺利容器化并上了K8s,同时也能通过外部网络进行请求访问,相关的服务数据也能进行持久化存储了,那么接下来…

etcd-workbench一款免费好用的ETCD客户端,支持SSHTunnel、版本对比等功能

介绍 今天推荐一款完全免费的ETCD客户端,可以私有化部署: etcd-workbench 开源地址:https://github.com/tzfun/etcd-workbench Gitee地址:https://gitee.com/tzfun/etcd-workbench 下载 本地运行 从 官方Release 下载最新版的 jar 包&am…

使用minio实现大文件断点续传

部署 minio 拉取镜像 docker pull minio/minio docker images新建映射目录 新建下面图片里的俩个目录 data(存放对象-实际的数据) config 存放配置开放对应端口 我使用的是腾讯服务器所以 在腾讯的安全页面开启 9000,9090 两个端口就可以了(根据大家实际…

新建项目EasyUiAutotest,安装Appium-Python-Client

一、前置说明 Appium-Python-Client 是 Appium 的 Python 客户端库,它提供了一系列的类和方法,用于与 Appium 服务器进行通信,并执行各种移动应用测试操作,包括启动应用、模拟用户输入、点击等操作。 二、操作步骤 1. 启动Pych…

iOS - 真机调试的新经验

文章目录 获取真机 UDIDPlease reconnect the device.iOS 开发者模式Fetching debug symbols 很久没有在真机运行 iOS 测试了,今天帮忙调试,发现很多东西都变了,有些东西也生疏了,在这里记录下。 获取真机 UDID 创建Profile 需要…

云服务器安装Docker并启动相关服务

云服务器安装Docker 环境准备1、云服务器2、在windterm创建会话2.1、登录2.2、身份验证失败的解决方案在创建好终端服务器修改密码修改会话设置取消不必要的验证 2.3生成密钥流程 3、安装docker3.1 安装报错3.2 解决方案3.2.1操作步骤3.2.1.1 查看当前目录下有那些文件3.2.1.2跳…

数禾使用 Knative 加速 AI 模型服务部署丨KubeCon China 2023

作者:李鹏(阿里云)、魏文哲(数禾科技), 此文基于 KubeCon China 2023 分享整理 摘要 AI 服务的数据、训练、推理等都需要消耗大量的计算资源以及运维成本,在数禾科技的金融业务场景下&#xf…

Python数据科学视频讲解:特征决策树分箱

5.3 特征决策树分箱 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解5.3节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应用的全流程,包括数据科学应…

喷淋实验--嵌入式实训

喷淋实验--嵌入式实训 1.MQTT通信原理 采集信息: 小程序/Linux 订阅者 1703161172612/AIOTSIM2APP 元宇宙 发布者 1703161172612/AIOTSIM2APP Linux订阅的主题是元宇宙发布的主题 控制设备: 小程序/Linux 发布者 1703161172612/APP2AIOTSIM 元宇宙 订阅者…