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的原因可能是看它既简单,好入门,现在俨然是语言中的一匹黑马. ...
随机推荐
- Oracle 查看表空间使用率
SELECT Upper(F.TABLESPACE_NAME) "TablespaceName", D.TOT_GROOTTE_MB "Total(M)", D ...
- 复习第7点-7.SpringMVC 的响应方式
1.使用ServletAPI实现转发 /* 使用HttpServletRequest对象实现请求转发 */ @RequestMapping("/httpServletRequest" ...
- Wordpress主题twentytwelve修改首页文章摘要
方法:网站后台->外观->编辑->找到content.php文件 路径:wp-content/themes/twentytwelve/ 找到这一句: <?php if ( is ...
- Docker 容器基本操作(基础)
拉钩教育App版权问题,如果转载请附带拉钩教育等信息 一,什么是容器 容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器 二.容器生命周期,五个状态 stopped : 停止状态 ...
- 使用stream流对数据进行处理
1. 使用场景 本次使用是通过条件查询出所需要的多个字段后,对其进行处理(一个条件查询多个下拉框内容,并对每个下拉框内容封装对象,进行返回) 2. 代码 点击查看代码 //获取所有需要的数据 List ...
- flask中的线程隔离技术
一.引入: 在无线程隔离情况下,通过线程调用函数,函数内部改变传入对象的属性值(排除非线程安全情况),都将更改传入的对象属性 1 import threading 2 3 class TestThre ...
- Visual Studio 2013图标变白
今天一打开电脑,就发现我的Visual Studio 2013的图标变成白色的了,我点开程序发现程序照常可以运行. 于是我就百度,有的说看注册表,发现缺少文件,结果我也没缺,还有什么更换主题的,都不管 ...
- 关于sqlyang 连接远程服务器 MySQL "1251-client does not support authentication..."的处理办法
原因是在mysql8之前的版本中加密规则为mysql_native_password而在mysql8以后的加密规则为caching_sha2_password. 做如下修改 ALTER USER 'r ...
- taskkill报taskkill不是内部或者外部命令,也不是可运行程序
转载一下处理这个'taskkill报taskkill不是内部或者外部命令,也不是可运行程序' 的问题:https://blog.csdn.net/wangying_2016/article/detai ...
- 求助:我需要用Python中parsel模块提取文章的文本内容,有什么办法
求助: 像这样 我想提取小说文章内容 怎么提取 我要用的模块有parsel <!DOCTYPE html> <html lang="en"> <hea ...