应用目录结构:

    

  views.py

from django.shortcuts import render

# Create your views here.
from django.views import View
from django.http import JsonResponse, QueryDict
from bookset.models import BookInfo #导入序列化列
from .serializers import BookInfoSerializer #################################################################
#########################序列化##########################################
class BookInfoView(View):
def get(self,request):
#1.操作数据库
books=BookInfo.objects.all()
#2.序列化
#创建序列化对象
#参数1:isntance.要序列化的模型数据
#参数2:data要反序列化的字典数据
#参数3:many,是否要序列化多个模型数据,多条数据many=True,默认为false
#参数4:context=序列化的上下文.字典类型数据.可以通过context把视图中的数据,传递给序列化器内部使用 serislizer=BookInfoSerializer(instance=books,many=True,)
#通过serializer.data获取序列化完成的数据
print(serislizer.data)
#3.返回数据
return JsonResponse(serislizer.data,safe=False) #######################################################
# 序列化器反序列化阶段的使用
# 校验数据和字典数据转换成模型
#############################反序列化###############################
from django.views import View
from django.http import JsonResponse
from .serializers import BookInfo2Serializer
class BookInfo2View(View):
def post(self,request):
#添加一本书
#1.接收数据
data=request.POST
#2.反序列化,验证数据
#1.验证数据
# 抛出异常
# is_valid调用验证方式:字段选项validators->自定义验证方法[单选项]->自定义验证方法[多选项]
# 验证成功后的数据
serializer=BookInfo2Serializer(data=data)
ret=serializer.is_valid(raise_exception=True)
print(serializer.validated_data)
# 转换数据成模型.同步到数据库中
# save会自动调用序列化器类里面声明的create/update方法,返回值是当前新增/更新的模型对象
serializer.save() #3.响应数据
print("====",serializer.data)
#这边响应的数据一定是序列化器反序列化后的数据,否则,异常不会返回给前端
return JsonResponse(serializer.data) def put(self,request,pk):
'''更新一个图书'''
#根据主键获取指定图书信息
book=BookInfo.objects.get(pk=pk)
#接受客户端提交过来的数据
data=QueryDict(request.body)
print(data)
#使用序列化器完成验证和反序列化的过程
#partial=True 接下来在反序列化中允许部分数据更新,针对字段选项必填的情况
serializer=BookInfo2Serializer(instance=book,data=data,partial=False)
print("++++++++",serializer)
ret=serializer.is_valid()
print(ret)
#save之所以可以自动识别,什么时候执行create,什么时候执行update,
#主要按创建序列化器对象时候,是否有传入instance
#有instance参数,则save会调用序列化器中的update
#没有instance参数,则save会抵用序列化器内部的create
serializer.save()
return JsonResponse(serializer.data) ##############################################
#3. 模型序列化器
# 1.可以帮助我们自动完成字声明[主要从模型中的字段声明里面提取过来]
# 2.模型序列化器要可以帮我们声明create和update的方法和代码
##############################################
from django.views import View
from django.http import JsonResponse
from .serializers import BookInfoModelSerializer class BookInfo3view(View):
def post(self,request):
'''添加一本图书'''
#接收数据
data=request.POST
print(data)
#反序列化
serializer=BookInfoModelSerializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
return JsonResponse(serializer.data) def put(self,request,pk):
'''更新一本图书'''
book=BookInfo.objects.get(pk=pk)
#获取数据
data=QueryDict(request.body)
#反序列化
serializer=BookInfoModelSerializer(instance=book,data=data,partial=True)
serializer.is_valid(raise_exception=True)
serializer.save() return JsonResponse(serializer.data)

  serializers.py(自己创建的,管理序列化器使用)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author tom ##################################################
# 序列化器之序列化
##################################################
from rest_framework import serializers from bookset.models import BookInfo class BookInfoSerializer(serializers.Serializer):
#自定义要序列化反序列化的字段
id=serializers.IntegerField(label='主键id',read_only=True)
btitle=serializers.CharField(label='图书标题')
bpub_date=serializers.DateField(label='出版日期')
bread=serializers.IntegerField(label='阅读量')
bcomment=serializers.IntegerField(label='评论量')
is_delete=serializers.BooleanField(label="逻辑删除") ###########################################################
# 2 序列化器的反序列化阶段使用
# 主要用户验证数据和字典数据转换成模型
#######################################################
from rest_framework import serializers
# is_valid调用验证方式:字段选项validators->自定义验证方法[单选项]->自定义验证方法[多选项] #自定义字段选选项函数(比较少用,一般用内置的)
def check_btitle(data):
if data=='西厢记':
raise serializers.ValidationError('西厢记也好黄啊')
#一定要返回数据
return data class BookInfo2Serializer(serializers.Serializer):
#自定义反序列化的字段
btitle = serializers.CharField(label='图书标题',min_length=1,max_length=128,validators=[check_btitle])
bpub_date = serializers.DateField(label='出版日期')
bread = serializers.IntegerField(label='阅读量',min_value=0)
bcomment = serializers.IntegerField(label='评论量',default=0)
#表示当前字段可以不填
is_delete = serializers.BooleanField(label="逻辑删除") #自定义验证方法,单字段校验[验证单个字段,可以有多个方法]
#格式:def validate_字段名(self,data):#data当前字段对应值
#data是形参,sub写,代表的是当前字段对应的值
def validate_btitle(self,data):
if data=='红楼梦':
#抛出错误
raise serializers.ValidationError('红楼梦太色请了')
#校验过后一定要把数据值返回,否则数据值为空
return data # 多字段校验数据值data是所有字典的内容,字典类型
def validate(self,data):
bread=data.get('bread')
bcomment=data.get('bcomment') if bread>=bcomment:
return data
raise serializers.ValidationError('阅读量小于评论量,太假了') def create(self,validated_data): '''
view视图的save会调用此方法
保存数据,把字典转换成模型
:param validated_data: 客户提交过来的,并且经过验证的数据
:return:
'''
instance=BookInfo.objects.create(
btitle=validated_data.get('btitle'),
bread=validated_data.get('bread'),
bcomment=validated_data.get('bcomment'),
bpub_date=validated_data.get('bpub_date'),
is_delete = validated_data.get('is_delete')
)
return instance # def update(self,instance,validated_data):
# '''
# 更新数据
# instance 本次跟新操作的模型对象
# validated_data: 客户提交过来,并经过验证的数据
# :param instance:
# :param validated_data:
# :return:
# '''
# instance.btitle=validated_data.get("btitle"),
# instance.bread = validated_data.get("bread"),
# instance.bcomment = validated_data.get("bcomment"),
# instance.bpub_date = validated_data.get("bpub_date"),
# instance.is_delete = validated_data.get("is_delete"),
#
# #调用orm在操作
# instance.save()
# #返回模型对象
# return instance def update(self,instance,validated_data):
"""更新数据
instance 本次更新操作的模型对象
validated_data 客户端提交过来,并经过验证的数据
"""
instance.btitle=validated_data.get('btitle')
instance.bread=validated_data.get('bread')
instance.bcomment=validated_data.get('bcomment')
instance.bpub_date=validated_data.get('bpub_date')
instance.is_delete=validated_data.get('is_delete') # 调用ORM的保存更新操作
instance.save()
# 返回模型对象
return instance #########################################################
#3. 模型序列化器
# 1.可以帮助我们自动完成字声明[主要从模型中的字段声明里面提取过来]
# 2.模型序列化器要可以帮我们声明create和update的方法和代码,所我们不需要自己写crate和pub_date
#########################################################
from rest_framework import serializers
from bookset.models import BookInfo
class BookInfoModelSerializer(serializers.ModelSerializer):
#模型序列化器也可以自定义验证字段(某些数据库不存在,但是需要前端传过来的,可以进行自定义)
#例如:验证码,确认密码 class Meta:
model=BookInfo
fields="__all__" #可以给模型序列
# 化器里面指定的字段设置限制选项
extra_kwargs={
'bread':{"min_value":0,"required":True},
} # 自定义验证方法[验证单个字段,可以有多个方法]
# def validate_<字段名>(self,data): # data当前字段对应的值
def validate_btitle(self, data):
# 例如,图书名不能是红楼梦
if data == "红楼梦":
# 抛出错误
raise serializers.ValidationError("红楼梦是禁书~")
# 验证方法中,把数据值必须返回给字段,否则字段值为空
return data # 自定义验证方法[验证多个或者所有字段,只能出现一次]
def validate(self, data): # data 这个是所有字段的内容,字典类型
bread = data.get("bread")
bcomment = data.get("bcomment") if bread >= bcomment:
return data
raise serializers.ValidationError("阅读量小于评论量,数据太假了")

  models.py

from django.db import models

#定义图书模型类BookInfo
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 = 'book' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称 def __str__(self):
"""定义每个数据对象的显示信息"""
return "图书:《"+self.btitle+"》" #定义英雄模型类HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'female'),
(1, 'male')
)
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 = 'heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name def __str__(self):
return self.hname

  urls.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#author tom from django.urls import path, re_path
from .import views urlpatterns=[
path('books/',views.BookInfoView.as_view()),
path("books2/",views.BookInfo2View.as_view()),
re_path("books2/(?P<pk>\d+)/",views.BookInfo2View.as_view()), #model
path("books3/",views.BookInfo3view.as_view()),
re_path("books3/(?P<pk>\d+)/", views.BookInfo3view.as_view())
]

  主路由,项目路由:

urlpatterns = [
path('admin/', admin.site.urls),
path('api/',include("bookset.urls")),
#学习drf以后,编写的最终版本
path("app/",include("app.urls")),
path("ser/",include("ser.urls"))
]

drf序列化器的实例的更多相关文章

  1. drf序列化器serializers.SerializerMethodField()的用法

    问题描述: 为什么DRF中有时候返回的json中图片是带域名的,有时候是不带域名的呢? 解析: 带域名的结果是在view中对模型类序列化的,DRF在序列化图片的时候 会检查上下文有没有request, ...

  2. DRF序列化器的使用

    序列化器的使用 序列化器的使用分两个阶段: 在客户端请求时,使用序列化器可以完成对数据的反序列化. 在服务器响应时,使用序列化器可以完成对数据的序列化. 序列化的基本使用 使用的还是上一篇博文中使用的 ...

  3. DRF序列化器

    序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典 ...

  4. DRF 序列化器-Serializer (2)

    作用 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器 ...

  5. drf序列化器与反序列化

    什么是序列化与反序列化 """ 序列化:对象转换为字符串用于传输 反序列化:字符串转换为对象用于使用 """ drf序列化与反序列化 &qu ...

  6. 对drf序列化器的理解

    序列化: 将对象的状态信息转换为可以存储或传输的形式的过程.(百度定义) 对应到drf中,序列化即把模型对象转换为字典形式, 再返回给前端,主要用于输出 反序列化: 把其他格式转化为程序中的格式. 对 ...

  7. 关于定义序列化器时,read_only和write_only有什么作用

    关于序列化和反序列化 ​ 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如js ...

  8. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

  9. drf之序列化器的使用

    一.序列化器-Serializer 作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 完成数据校验功能 3. 反序列化,把客户端发送过来的数据,经 ...

随机推荐

  1. GridView删除行

    在GridView绑定数据的时候需要设置该GridView的主键值,设置的这个主键与取出来的数据的一个字段对应.比如,取出来的数据表中有个ID的字段,那设这个ID为该GridView的主键是比较好的. ...

  2. jQuery中关于toggle的使用

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>t ...

  3. oracle数据库查询全系整理

    oracle数据库方面的知识到今天已经整理了12篇.当然,这不是终点,这只是一个开始,希望我写的文章可以帮助更多初学数据库的童鞋快速上手,如果你觉得文章对你有帮助,那么恭喜你已经入门了,数据库里面的知 ...

  4. datetime 2017-10-21 10:09:02.560 转年月日的时间类型

    sql语句时间转年月日格式: 适用于多种时间格式 select  REPLACE(STUFF(CONVERT(char(10), REPLACE(CONVERT(varchar(10),'2017-1 ...

  5. Regularization and model selection

    Suppose we are trying select among several different models for a learning problem.For instance, we ...

  6. ElasticSearch 笔记(一)

    一.Elasticsearch 印象 分布式.全文检索.数据分析. 二.为什么不用传统关系型数据库,如 MySQL,做搜索 举个反例.假设有以下数据库表 t_game: id   name 1 唐僧取 ...

  7. Arduino I2C + DS1307实时时钟

    主要特性 DS1307是Maxim的串行.I2C实时时钟芯片.主要特性有: 工作电压:主电源电压4.5~5.5V,电池电压2.0~3.5V 功耗:电池供电.备份模式时<500nA 接口:I2C, ...

  8. NPOI row.Cells[i] 的坑

    我有A行B列的EXCEL表格: 获取一行数据: IRow row=sheet.GetRow(i); 正常是这样的 row.Cells.Count = B; 但由于会存在没有激活的单元格,导致 row. ...

  9. WeStrom自定义设置修改快捷键

    按照下图操作,不BB: 终极懒人设置:!!!

  10. java关键字(更新)

    1.final: ①final修饰类:该类不能被继承: ②final修饰方法:该方法不能被子类重写: ③final修饰变量:一.修饰基本数据类型变量,必须初始化,且值不能被改变:二.修饰引用数据类型变 ...