drf从入门到飞升仙界 04
序列化类常用字段和字段参数
常用字段类
#1 BooleanField
BooleanField()
#2 NullBooleanField
NullBooleanField()
#3 CharField
CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
#4 EmailField
EmailField(max_length=None, min_length=None, allow_blank=False)
#5 RegexField
RegexField(regex, max_length=None, min_length=None, allow_blank=False)
#6 SlugField
SlugField(max_length=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
#7 URLField
URLField(max_length=200, min_length=None, allow_blank=False)
#8 UUIDField
UUIDField(format=’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"
#9 IPAddressField
IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
#10 IntegerField
IntegerField(max_value=None, min_value=None)
#11 FloatField
FloatField(max_value=None, min_value=None)
#12 DecimalField
DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
#13 DateTimeField
DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
#14 DateField
DateField(format=api_settings.DATE_FORMAT, input_formats=None)
#15 TimeField
TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
#16 DurationField
DurationField()
#17 ChoiceField
ChoiceField(choices) choices与Django的用法相同
#18 MultipleChoiceField
MultipleChoiceField(choices)
#19 FileField
FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
#20 ImageField
ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) # 重要的,后续讲到
- ListField
ListField(child=, min_length=None, max_length=None)
- DictField
DictField(child=) # 需要掌握记住的:
- CharField IntegerField DecimalField DateTimeField BooleanField ListField DictField
常用字段参数
- 选项参数: # CharField及其子类的(EmailField) ---》反序列化的校验,字段自己的规则
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符 # IntegerField
max_value 最小值
min_value 最大值 # 所有字段类都有的
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
----看一眼忘掉-----
error_messages 包含错误编号与错误信息的字典
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息 # 重点:
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False # 反序列化校验执行流程
-1.先执行字段自己的校验规则
最大长度,最小长度,是否为空,是否必填,最小数字...
-2.validators=[方法,]
单独给这个字段加校验规则:
name=serializers.CharField(validators=[方法,])
-3.局部钩子校验规则
-4.全局钩子校验规则
序列化高级用法source(了解即可)
# 1.创建模型类,关联表关系
from django.db import models class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32) 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=32) class Author(models.Model):
name = models.CharField(max_length=32)
phone = models.CharField(max_length=11)
# 2.迁移表数据 # 3.序列化定制字段名字source
from rest_framework import serializers class BookSerializer(serializers.Serializer):
# 字段参数,通用的一些限制
# 所有字段都可以通过source指定定制字段
name_real = serializers.CharField(max_length=8,source='name')
price_real = serializers.CharField(source='price')
# 一对一,自己字段直接写
# 一对多,关联字段直接点
publish = serializers.CharField(source='publish.name')
# 多对多,搞不了,source不能用
authors = serializers.CharField(source='author.all')
序列化高级用法之定制字段的两种方式
# 方法一:SerializerMethodField定制
from rest_framework import serializers class BookSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8)
price = serializers.CharField() # 定制返回格式:方式1
publish_detail = serializers.SerializerMethodField() def get_publish_detail(self,obj):
return {'name':obj.publish.name,'addr': obj.publish.addr} # 定制返回格式:方式2
author_list = serializers.SerializerMethodField() def get_author_list(self, obj):
l = []
for author in obj.authors.all():
l.append({'name': author.name, 'phone': author.phone})
return l # 高级序列化之SerializerMethodField
"""
{
"name": "西游记",
"price": "77",
"publish":{"name":"北京出版社","addr":"北京"},
authors:[{name:lqz,phone:1111},{name:罗贯中,phone:1111}]
} """
# 方法二:在表模型中定制
# models.py from django.db import models # Create your models here. class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32) publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author') def publish_detail(self):
return {'name': self.publish.name,'addr': self.publish.addr} def author_list(self):
l = []
for author in self.authors.all():
l.append({'name': author.name,'phone':author.phone})
return l # serializers.py : 序列化类 from rest_framework import serializers class BookSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8)
price = serializers.CharField() publish_detail = serializers.DictField()
author_list = serializers.ListField()
多表关联反序列化保存
新增接口
# 视图类 views.py
from rest_framework import serializers
from .models import Book,Author,Publish class BookView(APIView):
# def get(self,request):
# books = Book.objects.all()
# ser = BookSerializer(instance=books, many=True)
# return Response(ser.data)
def post(self,request):
ser = BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'新增成功'})
else:
return Response({'code':101,'msg':ser.errors}) # 序列化类 serializers.py
class BookSerializer(serializers.Serializer):
# name和price 可用来序列化,也可用来反序列化,又读又写,不用加read_only,write_only
name = serializers.CharField(max_length=8)
price = serializers.CharField()
# 只用来序列化 只读 read_only
publish_detail = serializers.DictField(read_only=True)
author_list = serializers.ListField(read_only=True)
# 只用来反序列化 只写 write_only
publish = serializers.CharField(write_only=True)
authors = serializers.ListField(write_only=True)
# 新增 要重写create方法
def create(self,validated_data):
# validated_data是校验过后的数据,
# 新增一本图书
book = Book.objects.create(name=validated_data.get('name'),price=validated_data.get('price'),
publish_id = validated_data.get('publish'))
# price = validated_data.get('price'),
# publish_id = validated_data.get('publish')
# 把作者与书关联
book.authors.add(*validated_data.get('authors'))
return book
修改更新接口
# 视图类 views.py
from rest_framework.views import APIView
from .models import Book
from .serializers import BookSerializer
from rest_framework.response import Response
from rest_framework.exceptions import ValidationError class BookDetailView(APIView):
def put(self,request,pk):
book = Book.objects.filter(pk=pk).first()
ser = BookSerializer(data=request.data,instance=book)
if ser.is_valid():
ser.save()
return Response({'code':100,'msg':'修改成功'})
else:
return Response({'code': 101, 'msg':ser.errors}) # 序列化类 serializers.py
from rest_framework import serializers
from .models import Book,Author,Publish
class BookSerializer(serializers.Serializer):
name = serializers.CharField(max_length=8)
price = serializers.CharField()
# 只用来序列化 只读 read_only
publish_detail = serializers.DictField(read_only=True)
author_list = serializers.ListField(read_only=True)
# 只用来反序列化 只写 write_only
publish = serializers.CharField(write_only=True)
authors = serializers.ListField(write_only=True) # 修改要重写update
def update(self,instance,validated_data):
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
instance.publish_id = validated_data.get('publish')
# 先清空,在添加
authors = validated_data.get('authors')
instance.authors.clear()
instance.authors.add(*authors)
instance.save()
return instance
反序列化字段校验其他
# 步骤:
-1 字段自己的:举例:name = serializers.CharField(max_length=8, error_messages={'max_length': '太长了'})
-2 validators=[方法,] 忽略掉
-3 局部钩子
-4 全局钩子
ModelSerializer使用
# ModelSerializer 继承自Serializer
-跟表模型强关联
-大部分请求,不用写create和update了 # ModelSerializer的使用
class BookSerializer(serializers.ModelSerializer):
# 和表有关联
class Meta:
model = Book # 跟book表建立了关系 序列化类和表模型类
# 序列化所有Book中的字段 id name price publish authors
# fields = '__all__'
# 序列化所有Book中的name和price字段字段
fields = ['name', 'price', 'publish_detail', 'author_list', 'publish', 'authors'] # 定制name反序列化时,最长不能超过8 ,给字段类加属性
# 方式一
extra_kwargs = {'name': {'max_length': 8},
'publish_detail': {'read_only': True},
'author_list': {'read_only': True},
'publish': {'write_only': True},
'authors': {'write_only': True},
} # 如果Meta写了__all__ ,就相当于,复制了表模型中的所有字段,放在了这里,做了个映射
# name = serializers.CharField(max_length=32)
# price = serializers.CharField(max_length=32) # 定制name反序列化时,最长不能超过8 给字段类加属性---方式二,重写name字段
# name = serializers.CharField(max_length=8) # 同理,所有的read_only和wirte_only都可以通过重写或使用extra_kwargs传入 # 最后,把这个序列化类写成跟之前一模一样项目
# publish_detail = serializers.SerializerMethodField(read_only=True)
# def get_publish_detail(self, obj):
# return {'name': obj.publish.name, 'addr': obj.publish.addr}
# author_list = serializers.SerializerMethodField(read_only=True)
# def get_author_list(self, obj):
# l = []
# for author in obj.authors.all():
# l.append({'name': author.name, 'phone': author.phone})
# return l # 局部钩子和全局钩子跟之前完全一样
def validate_name(self, name):
if name.startswith('sb'):
raise ValidationError('不能sb') else:
return name
drf从入门到飞升仙界 04的更多相关文章
- 【Lucene3.6.2入门系列】第04节_中文分词器
package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...
- php从入门到放弃系列-04.php页面间值传递和保持
php从入门到放弃系列-04.php页面间值传递和保持 一.目录结构 二.两次页面间传递值 在两次页面之间传递少量数据,可以使用get提交,也可以使用post提交,二者的区别恕不赘述. 1.get提交 ...
- 111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现
111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现 本文知识点: 继承的实现 说明:因为时间紧张,本人写博客过程中只是对知识点 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- Docker从入门到飞升:基础配置安装
导读 Docker近几年非常火,因为它是容器虚拟化,更能够充分提高硬件资源的使用率.其实利用率高不算什么,它最大的优势是能给让运维人员或者开发人员快速部署和交付资源,大大提高了工作效率.几乎所有的大企 ...
- Linux性能优化从入门到实战:04 CPU篇:CPU使用率
CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00 ...
- 【转载】maven入门1
学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门) 2007-08-28 14:01:04 标签:maven 职场 休闲 一.前言 早就知道maven 在java 项目的管理 ...
- php从入门到放弃系列-01.php环境的搭建
php从入门到放弃系列-01.php环境的搭建 一.为什么要学习php 1.php语言适用于中小型网站的快速开发: 2.并且有非常成熟的开源框架,例如yii,thinkphp等: 3.几乎全部的CMS ...
- drf源码剖析系列(系列目录)
drf源码剖析系列(系列目录) 01 drf源码剖析之restful规范 02 drf源码剖析之快速了解drf 03 drf源码剖析之视图 04 drf源码剖析之版本 05 drf源码剖析之认证 06 ...
- Python学习从入门到放弃?我不允许!!!
嗨,大家好 这里是汐仔 很多人都说学习python学习python,打开书本,三分钟,从入门到放弃. 这怎么可以!!!大家能选择python的原因可能是看它既简单,好入门,现在俨然是语言中的一匹黑马. ...
随机推荐
- CodeGym自学笔记05——类名
1.Java 程序由类组成.每个类都存储在一个单独的文件中,其文件名称与类名一致.该文件的扩展名为 java. 2.当我们有许多类文件时,我们会将它们分组到文件夹和子文件夹中.此外,类还会被分组到包和 ...
- cookie,session,token,drf-jwt
1.cookie,session,token发展史 引入:我们都知道 http 协议本身是一种无状态的协议,一个普通的http请求简单分为三步:客户端发送请求request服务端收到请求并进行处理服务 ...
- Mac 如何用python下载Mac OS
Python脚本下载 开源地址:macadmin-scripts 打开终端 : git clone https://github.com/munki/macadmin-scripts 下载inst ...
- git 删除本地分支以及远程分支
1.git branch -a 2. git branch -d v1.3(要删除的本地分支) 3.git push origin --delete v1.3(远程分支)
- 【安全记录】certutil实战使用总结
前言 在先知看到一篇关于certutil命令的文章(关于certutil的探究),讲得很详细.很全面.特此记录下本人在渗透时使用certutil的一些方法. 在cmd下使用certutil下载远程文件 ...
- python菜鸟学习: 13. excel文件编辑openpyxl使用
#1. xls文件转换成xlsx文件,需要使用到 win32com from win32com import client as wc filepath = "D:\\python\\liy ...
- SDN第三次实验
实验3:OpenFlow协议分析实践 实验目的 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包: 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机 ...
- 组件中的data为什么不是一个对象而是一个函数?
组件中的data为什么不是一个对象而是一个函数? 组件是可复用的vue实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data数据都应该是相互隔离,互不影响的,基于 ...
- 使用Android studio配置软件签名,并在车机安装
系统级APP,可在Androidmanifest.xml中配置属性,并使用系统级签名. 1. 签名方式 1.1 bulid.gradle(:app)中添加签名信息 1.2 使用Android stud ...
- pie-engine-ai项目jenkins.yaml文件
apiVersion: apps/v1kind: Deploymentmetadata: name: jenkins namespace: pie-engine-ai labels: name: je ...