序列化类常用字段和字段参数

常用字段类

#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的更多相关文章

  1. 【Lucene3.6.2入门系列】第04节_中文分词器

    package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...

  2. php从入门到放弃系列-04.php页面间值传递和保持

    php从入门到放弃系列-04.php页面间值传递和保持 一.目录结构 二.两次页面间传递值 在两次页面之间传递少量数据,可以使用get提交,也可以使用post提交,二者的区别恕不赘述. 1.get提交 ...

  3. 111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现

    111 01 Android 零基础入门 02 Java面向对象 04 Java继承(上)02 继承的实现 01 继承的实现 本文知识点: 继承的实现 说明:因为时间紧张,本人写博客过程中只是对知识点 ...

  4. SLAM+语音机器人DIY系列:(二)ROS入门——3.在ubuntu16.04中安装ROS kinetic

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  5. Docker从入门到飞升:基础配置安装

    导读 Docker近几年非常火,因为它是容器虚拟化,更能够充分提高硬件资源的使用率.其实利用率高不算什么,它最大的优势是能给让运维人员或者开发人员快速部署和交付资源,大大提高了工作效率.几乎所有的大企 ...

  6. Linux性能优化从入门到实战:04 CPU篇:CPU使用率

      CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示. $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00 ...

  7. 【转载】maven入门1

    学习maven的使用,看到一篇很实用的入门教程(菜鸟级入门) 2007-08-28 14:01:04 标签:maven 职场 休闲 一.前言         早就知道maven 在java 项目的管理 ...

  8. php从入门到放弃系列-01.php环境的搭建

    php从入门到放弃系列-01.php环境的搭建 一.为什么要学习php 1.php语言适用于中小型网站的快速开发: 2.并且有非常成熟的开源框架,例如yii,thinkphp等: 3.几乎全部的CMS ...

  9. drf源码剖析系列(系列目录)

    drf源码剖析系列(系列目录) 01 drf源码剖析之restful规范 02 drf源码剖析之快速了解drf 03 drf源码剖析之视图 04 drf源码剖析之版本 05 drf源码剖析之认证 06 ...

  10. Python学习从入门到放弃?我不允许!!!

    嗨,大家好 这里是汐仔 很多人都说学习python学习python,打开书本,三分钟,从入门到放弃. 这怎么可以!!!大家能选择python的原因可能是看它既简单,好入门,现在俨然是语言中的一匹黑马. ...

随机推荐

  1. CodeGym自学笔记05——类名

    1.Java 程序由类组成.每个类都存储在一个单独的文件中,其文件名称与类名一致.该文件的扩展名为 java. 2.当我们有许多类文件时,我们会将它们分组到文件夹和子文件夹中.此外,类还会被分组到包和 ...

  2. cookie,session,token,drf-jwt

    1.cookie,session,token发展史 引入:我们都知道 http 协议本身是一种无状态的协议,一个普通的http请求简单分为三步:客户端发送请求request服务端收到请求并进行处理服务 ...

  3. Mac 如何用python下载Mac OS

    ​ Python脚本下载 开源地址:macadmin-scripts 打开终端 : git clone https://github.com/munki/macadmin-scripts 下载inst ...

  4. git 删除本地分支以及远程分支

    1.git branch -a 2. git branch -d v1.3(要删除的本地分支) 3.git push origin --delete v1.3(远程分支)

  5. 【安全记录】certutil实战使用总结

    前言 在先知看到一篇关于certutil命令的文章(关于certutil的探究),讲得很详细.很全面.特此记录下本人在渗透时使用certutil的一些方法. 在cmd下使用certutil下载远程文件 ...

  6. python菜鸟学习: 13. excel文件编辑openpyxl使用

    #1. xls文件转换成xlsx文件,需要使用到 win32com from win32com import client as wc filepath = "D:\\python\\liy ...

  7. SDN第三次实验

    实验3:OpenFlow协议分析实践 实验目的 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包: 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机 ...

  8. 组件中的data为什么不是一个对象而是一个函数?

    组件中的data为什么不是一个对象而是一个函数? 组件是可复用的vue实例,一个组件被创建好之后,就可能被用在各个地方,而组件不管被复用了多少次,组件中的data数据都应该是相互隔离,互不影响的,基于 ...

  9. 使用Android studio配置软件签名,并在车机安装

    系统级APP,可在Androidmanifest.xml中配置属性,并使用系统级签名. 1. 签名方式 1.1 bulid.gradle(:app)中添加签名信息 1.2 使用Android stud ...

  10. pie-engine-ai项目jenkins.yaml文件

    apiVersion: apps/v1kind: Deploymentmetadata: name: jenkins namespace: pie-engine-ai labels: name: je ...