Django REST framework 中的序列化器
from rest_framework.viewsets import ModelViewSet from .models import BookInfo
from .serializers import BookInfoSerializers class BookInfoViewSet(ModelViewSet):
queryset = BookInfo.objects.all() # 取序列化模型
serializer_class = BookInfoSerializers # 指定序列化的类
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/
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
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)
# 查询图书的的对象 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} """
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)
from app001.models import BookInfo book = BookInfo.objects.all()[0] # 构造序列化器
from app001.serializers import BookInfoSerializers bs = BookInfoSerializers(book) # 获取序列化之后的属性
print(bs.data)
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
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 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
{}
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 中的序列化器的更多相关文章
- DRF中的序列化器
DRF中的序列化器详细应用 视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...
- Python的Django REST框架中的序列化及请求和返回
Python的Django REST框架中的序列化及请求和返回 序列化Serialization 1. 设置一个新的环境 在我们开始之前, 我们首先使用virtualenv要创建一个新的虚拟环境,以使 ...
- Django REST framework 中文文档
Django REST framework介绍 现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势. 显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Dj ...
- Django REST framework 中的视图
1.Request REST framework传入视图的request对象不再是Django默认的Httprequest对象,而是DRF提供的扩展类的Request类的对象 常用属性 request ...
- DRF (Django REST framework) 中的视图类
视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...
- DRF (Django REST framework) 中的Request 与 Response
DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...
- 在django restful framework中设置django model的property
众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...
- Django:(08)序列化器
1.序列化和反序列化变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上.反过来,把变量内容从序列化的对象重新读到内存里称之为反序列 ...
- Django REST framework中的版本控制
1.REST framework版本控制的流程分析 1.1 determine_version方法的执行流程 首先,请求到达REST framework的CBV,执行CBV中的dispatch方法再次 ...
随机推荐
- 实战--使用lvs实现四层负载均衡,转发到后端nginx
这个帖子讲得很细致,基本依照这个方案实践. 只是IP是按我自己虚拟机的IP来测试的. http://www.cnblogs.com/arjenlee/p/9262737.html ========== ...
- Idea的快捷键,瞎摸索,开心就好,哈哈哈
前言:如果你有强迫症,换了一个编辑器,最痛苦莫过于快捷键,不顺手了.这里自己瞎摸索的快捷键,贴一下,这里主要以实际应用为主,因为大量介绍的网上已经很多很多,So基本的不再叙述. 分享一下比较不错的Id ...
- C# Enum,Int,String的互相转换 [转]
C# Enum,Int,String的互相转换 Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名 ...
- javascript 对象(四)
一.对象概述 对象中包含一系列的属性,这些属性是无序的.每个属性都有一个字符串key和对应的value. var obj={x:1,y:2}; obj.x; obj.y; 1.为什么属性的key必须是 ...
- Java 中 static 和 volatile 关键字的区别?
static指的是类的静态成员,实例间共享 volatile跟Java的内存模型有关,线程执行时会将变量从主内存加载到线程工作内存,建立一个副本,在某个时刻写回.valatile指的每次都读取主内存的 ...
- 一起学Hive——详解四种导入数据的方式
在使用Hive的过程中,导入数据是必不可少的步骤,不同的数据导入方式效率也不一样,本文总结Hive四种不同的数据导入方式: 从本地文件系统导入数据 从HDFS中导入数据 从其他的Hive表中导入数据 ...
- Could not locate executable null\bin\winutils.exe in the Hadoop binaries解决方式 spark运行wordcoult
虽然可以正常运行,但是会出异常,现给出解决方法. 1.问题: 2. 问题解决: 仔细查看报错是缺少winutils.exe程序. Hadoop都是运行在Linux系统下的,在windows下ec ...
- 蓝桥杯 剪邮票(dfs枚举 + bfs)
剪邮票 如图1, 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,图2,图3中,粉红色所示部分就是合格的剪取. 请你计算,一共有多少种不同的 ...
- waf python build 工具使用流程
waf python build 工具使用流程 waf 的 build 理念 build 了之后,可以跟踪到 ${SRC} 和 ${TGT} 有关联的文件,只有 ${SRC} 被修改过,在下次buil ...
- apache环境配置 | httpd Could not reliably determine the server's fully qualified domain name
apache环境配置 | httpd Could not reliably determine the server's fully qualified domain name 转 https: ...