在此之前定义一个序列化工具:
 
 
views中的的代码
from rest_framework.viewsets import ModelViewSet

from .models import BookInfo
from .serializers import BookInfoSerializers class BookInfoViewSet(ModelViewSet):
queryset = BookInfo.objects.all() # 取序列化模型
serializer_class = BookInfoSerializers # 指定序列化的类
 
定制url
from django.conf.urls import url, include
from . import views from rest_framework.routers import DefaultRouter router = DefaultRouter()
router.register(r"books", views.BookInfoViewSet) urlpatterns = [
url(r'^index/$', views.index),
] urlpatterns += router.urls
 
访问路径配置
http://127.0.0.1:8000/app001/books/
 
 
定制普通的序列化类
已有的model数据类型如下所示:
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名称')
bpub_date = models.DateField(verbose_name='发布日期')
bread = models.IntegerField(default=0, verbose_name='阅读量')
bcomment = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta:
db_table = 'tb_books' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称 def __str__(self):
return self.btitle
 
 
继承serializers.Serializer的序列化器:
# 为以上的model定制一个序列化器
from rest_framework import serializers

class BookInfoSerializers(serializers.Serializer):
""" 图书列表序列化器"""
id = serializers.IntegerField(label="ID", read_only=True)
btitle = serializers.CharField(label="名称", max_length=20)
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
is_delete = serializers.BooleanField(label='逻辑删除', required=False)
 
 
演示效果(python manages.py shell的环境下运行):
# 查询图书的的对象

from app001.models import BookInfo

book = BookInfo.objects.all()[0]

# 构造序列化器
from app001.serializers import BookInfoSerializers serializer = BookInfoSerializers(book) # 获取序列化之后的属性
print(serializer.data)

# 打印效果:
"""
{'id': 1, 'bpub_date': '1980-05-01', 'btitle': '射雕英雄传', 'is_delete': False, 'bcomment': 34, 'bread': 12} """
 
 
 
model类
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名称')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name def __str__(self):
return self.hname
 
 
序列化器
from rest_framework import serializers

class HeroInfoSerializers(serializers.Serializer):
"""英雄数据序列化器"""
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
# hname = models.CharField(max_length=20, verbose_name='名称')
id = serializers.IntegerField(label='ID', read_only=True)
# hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
hgender = serializers.ChoiceField(choices=GENDER_CHOICES, label='性别', required=False)
# hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hcomment = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)
# hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
# is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
 
 
 
 
交互界面输出
# 查询英雄的对象
from app001.models import HeroInfo

hero = HeroInfo.objects.all()[0]
from app001.serializers import HeroInfoSerializers hs = HeroInfoSerializers(hero) print(hs.data)
"""
{'hgender': 1, 'id': 1, 'hcomment': '降龙掌', 'hbook': '射雕英雄传'}
 
{'hgender': 1, 'id': 1, 'hcomment': '降龙掌', 'hbook': 1}
"""
此字段将被序列化为关联对象的主键。
 
(hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
hbook = serializers.PrimaryKeyRelatedField(label='图书',queryset=BookInfo.objects.all()))
print(hs.data)
"""
{'hgender': 1, 'id': 1, 'hcomment': '降龙掌', 'hbook': 1}
"""
(hbook = serializers.StringRelatedField(label='图书'))
print(hs.data)
"""
{'hgender': 1, 'id': 1, 'hcomment': '降龙掌', 'hbook': '射雕英雄传'}
"""
 
(    hbook = serializers.SlugRelatedField(label='图书', read_only=True, slug_field='bpub_date')
 
{'hbook': datetime.date(1980, 5, 1), 'hcomment': '降龙掌', 'hgender': 1, 'id': 1}
 
(    hbook = BookInfoSerializers()
 
{'hgender': 1, 'hcomment': '降龙掌', 'id': 1, 'hbook': OrderedDict([('id', 1), ('btitle', '射雕英雄传'), ('bpub_date', '1980-05-01'), ('bread', 12), ('bcomment', 34), ('is_delete', False)])}
 
 
 
(    hbook = BookRelateField(read_only="True"))
{'hcomment': '降龙掌', 'hbook': 'Book: 1 射雕英雄传', 'id': 1, 'hgender': 1}
 
 
 
(    heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)  # 新增
 
 
测试命令
from app001.models import BookInfo

book = BookInfo.objects.all()[0]

# 构造序列化器
from app001.serializers import BookInfoSerializers bs = BookInfoSerializers(book) # 获取序列化之后的属性
print(bs.data)
 
 
{'bread': 12, 'is_delete': False, 'bpub_date': '1980-05-01', 'heroinfo_set': [1, 2, 3, 4, 5], 'btitle': '射雕英雄传', 'id': 1, 'bcomment': 34}
 
 
 
from app001.serializers import BookInfoSerializers
data = {'bpub_date': 123}
serializer = BookInfoSerializers(data=data)
serializer.is_valid()
serializer.errors
serializer.validated_data
 
 
from app001.serializers import BookInfoSerializers
data = {'bpub_date': "1993-12-27", 'btitle': 'python'}
serializer = BookInfoSerializers(data=data)
serializer.is_valid()
serializer.errors
serializer.validated_data
"""
OrderedDict([('btitle', 'python'), ('bpub_date', datetime.date(1993, 12, 27))])
 
"""
 
 
验证失败报404异常
serializer.is_valid(raise_exception=True)
 
from rest_framework import serializers

class BookInfoSerializers(serializers.Serializer):
""" 图书列表序列化器"""
id = serializers.IntegerField(label="ID", read_only=True)
btitle = serializers.CharField(label="名称", max_length=20)
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
is_delete = serializers.BooleanField(label='逻辑删除', required=False)
heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增 def validate_btitle(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
return value
 
from app001.serializers import BookInfoSerializers
data = {'bpub_date': "1993-12-27", 'btitle': 'python_django'}
serializer = BookInfoSerializers(data=data)
serializer.is_valid()
serializer.errors
serializer.validated_data
"""
OrderedDict([('btitle', 'python_django'), ('bpub_date', datetime.date(1993, 12, 27))])
 
"""
 
在序列化器中定义一个validate()在这个方法中定义的字段会在最后被验证;
from rest_framework import serializers

def about_django(value):
if 'django' not in value.lower():
raise serializers.ValidationError("about_django中抛出图书不是关于Django的") class BookInfoSerializers(serializers.Serializer):
""" 图书列表序列化器"""
id = serializers.IntegerField(label="ID", read_only=True)
btitle = serializers.CharField(label="名称", max_length=20,validators=[about_django])
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
is_delete = serializers.BooleanField(label='逻辑删除', required=False)
heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增 def validate(self, attrs):
bread = attrs['bread']
bcomment = attrs['bcomment']
if bread < bcomment:
raise serializers.ValidationError('阅读量小于评论量')
return attrs
 
 
 
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 34, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'python_django'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{'non_field_errors': [ErrorDetail(string='阅读量小于评论量', code='invalid')]}
>>> serializer.validated_data
{}
抛出异常:
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 14, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'ptython'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{'btitle': [ErrorDetail(string='about_django中抛出图书不是关于Django的', code='invalid')]}
>>> serializer.validated_data
{}
>>>
 
 
在序列化器类的内部定义一个方法,来验证字段的属性(注意定义的函数的结构);
from rest_framework import serializers

class BookInfoSerializers(serializers.Serializer):
""" 图书列表序列化器"""
id = serializers.IntegerField(label="ID", read_only=True)
btitle = serializers.CharField(label="名称", max_length=20,validators=[about_django])
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
is_delete = serializers.BooleanField(label='逻辑删除', required=False)
heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增 def validate_btitle(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
return value
 
验证成功:
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'python_django'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
True
>>> serializer.errors
{}
>>> serializer.validated_data
OrderedDict([('btitle', 'python_django'), ('bpub_date', datetime.date(1993, 12, 27)), ('bread', 12), ('bcomment', 10)])
>>>
 
 
验证失败:
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'ptython'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{'btitle': [ErrorDetail(string='图书不是关于Django的', code='invalid')]}
>>> serializer.validated_data
{}
 
 
在序列化器的外部定义一个方法,将该方法加入到字段中作为字段的验证方法
from rest_framework import serializers

def about_django(value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的") class BookInfoSerializers(serializers.Serializer):
""" 图书列表序列化器"""
id = serializers.IntegerField(label="ID", read_only=True)
btitle = serializers.CharField(label="名称", max_length=20,validators=[about_django])
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
is_delete = serializers.BooleanField(label='逻辑删除', required=False)
heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增 def validate_btitle(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
return value def validate(self, attrs):
bread = attrs['bread']
bcomment = attrs['bcomment']
if bread < bcomment:
raise serializers.ValidationError('阅读量小于评论量')
return attrs
 
返回成功:
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'ptython_django'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
True
>>> serializer.errors
{}
>>> serializer.validated_data
OrderedDict([('btitle', 'ptython_django'), ('bpub_date', datetime.date(1993, 12, 27)), ('bread', 12), ('bcomment', 10)])
 
返回失败:
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'ptython'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
False
>>> serializer.errors
{'btitle': [ErrorDetail(string='about_django中抛出图书不是关于Django的', code='invalid')]}
>>> serializer.validated_data
{}
 
 
验证顺序:
验证顺序:
1,model字段本身;
2,字段中定义的validators;
3,序列化器中定义的对字段的验证方法validate_字段名;
4, 序列话器中validate的方法。
 
单字段唯一;
from rest_framework.validators import UniqueValidator

slug = SlugField(
max_length=100,
validators=[UniqueValidator(queryset=BlogPost.objects.all())]
)
 
 
联合唯一;
from rest_framework.validators import UniqueTogetherValidator

class ExampleSerializer(serializers.Serializer):
# ...
class Meta:
validators = [
UniqueTogetherValidator(
queryset=ToDoItem.objects.all(),
fields=('list', 'position')
)
]
 
 
序列化后的数据保存
 
验证未通过程序包报错:
>>> from app001.serializers import BookInfoSerializers
>>> data = {'btitle': '封神演义'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
False
>>> serializer.save()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/python/.virtualenvs/djf/lib/python3.5/site-packages/rest_framework/serializers.py", line 184, in save
'You cannot call `.save()` on a serializer with invalid data.'
AssertionError: You cannot call `.save()` on a serializer with invalid data.
 
 
验证通过并保存
>>> from app001.serializers import BookInfoSerializers
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1993-12-27", 'btitle': 'ptython_django'}
>>> serializer = BookInfoSerializers(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<BookInfo: ptython_django>
 
 
 
序列化器的定义
from rest_framework import serializers

def about_django(value):
if 'django' not in value.lower():
raise serializers.ValidationError("about_django中抛出图书不是关于Django的") class BookInfoSerializers(serializers.Serializer):
""" 图书列表序列化器"""
id = serializers.IntegerField(label="ID", read_only=True)
btitle = serializers.CharField(label="名称", max_length=20, validators=[about_django])
bpub_date = serializers.DateField(label='发布日期', required=False)
bread = serializers.IntegerField(label='阅读量', required=False)
bcomment = serializers.IntegerField(label='评论量', required=False)
is_delete = serializers.BooleanField(label='逻辑删除', required=False)
heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增 def validate_btitle(self, value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
return value def create(self, validated_data):
"""新建"""
return BookInfo.objects.create(**validated_data) def update(self, instance, validated_data):
"""更新,instance为要更新的对象实例"""
instance.btitle = validated_data.get('btitle', instance.btitle)
instance.bpub_date = validated_data.get('bpub_date', instance.bpub_date)
instance.bread = validated_data.get('bread', instance.bread)
instance.bcomment = validated_data.get('bcomment', instance.bcomment)
instance.save()
return instance
 
成功创建对象
>>> from app001.serializers import BookInfoSerializers
>>> # from app001.models import BookInfo
>>> # book = BookInfo.objects.filter(btitle="ptython_django")[0]
>>> book = BookInfo.objects.get(id=10)
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1994-12-27", 'btitle': 'ptython_django'}
>>> # data = {'bpub_date': "1994-12-27",'bcomment': 10, 'bread': 12,}
>>> serializer = BookInfoSerializers(book, data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<BookInfo: ptython_django>
>>> book.btitle
'ptython_django'
>>>
 
成功修改对象传入对象中的属性;
>>> from app001.serializers import BookInfoSerializers
>>> from app001.models import BookInfo
>>> book = BookInfo.objects.filter(btitle="ptython_django")[0]
>>> data = {'bcomment': 10, 'bread': 12,'bpub_date': "1995-12-27", 'btitle': 'ptython_django'}
>>> serializer = BookInfoSerializers(book, data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<BookInfo: ptython_django>
>>> book.btitle
'ptython_django'
>>> book.bpub_date
datetime.date(1995, 12, 27)
 
 
 
修改通过书名取到的的对象的值;
>>> from app001.serializers import BookInfoSerializers
>>> from app001.models import BookInfo
>>> book = BookInfo.objects.filter(btitle="ptython_django")[0]
>>> data = {'bpub_date': "1996-12-27", 'btitle': 'ptython_django'}
>>> serializer = BookInfoSerializers(book, data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
<BookInfo: ptython_django>
>>> book.btitle
'ptython_django'
>>> book.bpub_date
datetime.date(1996, 12, 27)
 
 

Django REST framework 中的序列化器的更多相关文章

  1. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  2. Python的Django REST框架中的序列化及请求和返回

    Python的Django REST框架中的序列化及请求和返回 序列化Serialization 1. 设置一个新的环境 在我们开始之前, 我们首先使用virtualenv要创建一个新的虚拟环境,以使 ...

  3. Django REST framework 中文文档

    Django REST framework介绍 现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势. 显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Dj ...

  4. Django REST framework 中的视图

    1.Request REST framework传入视图的request对象不再是Django默认的Httprequest对象,而是DRF提供的扩展类的Request类的对象 常用属性 request ...

  5. DRF (Django REST framework) 中的视图类

    视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...

  6. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

  7. 在django restful framework中设置django model的property

    众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...

  8. Django:(08)序列化器

    1.序列化和反序列化变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上.反过来,把变量内容从序列化的对象重新读到内存里称之为反序列 ...

  9. Django REST framework中的版本控制

    1.REST framework版本控制的流程分析 1.1 determine_version方法的执行流程 首先,请求到达REST framework的CBV,执行CBV中的dispatch方法再次 ...

随机推荐

  1. 【BZOJ4764】弹飞大爷

    题解: 这个应该还是比较简单的 首先比较容易想到用lct来维护 我们可以建立一个特殊点 然后我们要处理环 其实只要判断它和不和这个特殊点联通就行了 那么当它不是环了我们怎么还原呢 只要对每个在根节点记 ...

  2. Visual Studio 中使用万能头文件 #include <bits/stdc++.h>

    最近开始使用VS,之前用的DEV C++软件可直接使用 #include <bits/stdc++.h>  ,但VS中并没有,为了使用方便,可直接在VS中添加此头文件,方法如下: 1.在安 ...

  3. dedecms首页入口的详细注释

    今天闲来无事,就拿来dede首页的文件给大家详细解释一遍,以便于新手学习,注释过程非常非常非常的详细,里面解释到dede表前缀#@__代替的原理.解释到dede很多自定义函数的具体位置和具体作用等等疑 ...

  4. Flink的容错

    checkpoint介绍 checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保 ...

  5. Codeforces 387E George and Cards

    George and Cards 我们找到每个要被删的数字左边和右边第一个比它小的没被删的数字的位置.然后从小到大枚举要被删的数, 求答案. #include<bits/stdc++.h> ...

  6. Codeforces Gym100783H 最短路 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100783H.html 题目传送门 - CF-Gym100783H 题意 给定一个 $n$ 个节点 ...

  7. Java中字符串比较的问题

    package com.hxl; import java.util.Scanner; public class Test { public static void main(String[] args ...

  8. ORA-12154: TNS: 无法解析指定的连接标识符 问题

    ORA-12154: TNS: 无法解析指定的连接标识符 问题:https://zhidao.baidu.com/question/397519550.html

  9. Hive的配置| 架构原理

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能. 本质是:将HQL转化成MapReduce程序 1)Hive处理的数据存储在HDFS 2)Hi ...

  10. Python3 序列解包

    转载自:https://blog.csdn.net/yilovexing/article/details/80576788 序列解包是 Python 3.0 之后才有的语法 什么是序列解包呢?先看一个 ...