rest framework 序列化
serializers 序列化组件
可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件
源码位置
rest_framework.serializers
源码中需要用到的
rest_framework.serializers
# 序列化工具类必须要继承此类 class ModelSerializer(Serializer):
命令
queryset/对象 -----> 序列化数据
bs=BookModelSerializers(queryset,many=True) # 对queryset 对象序列化 bs=BookModelSerializers(obj) # 对 对象序列化
序列化数据 -----> queryset
bs=BookModelSerializers(data=request.data) # 将序列化数据 转换成对象
数据校验
bs.is_valid()
数据提交转换成记录
# 不指定对象.create() 方法
bs=BookModelSerializers(data=request.data)
bs.save() # 指定对象.updata() 方法
bs=BookModelSerializers(book,data=request.data)
bs.save()
实例
序列化模块工具类
建立model字段的映射
如果将所有的字段转换,转换一对多多对多字段的值会是关联的主键值,
如果向显示关联的值就需要自定义,当 __all__ 和自定义字段都有的时候,优先使用自定义的
但是如果你使用了自定义的方法就需要重写 create方法。不然是报错无法正常的传输数据,因为默认的create是按照主键值来的。
序列化的定义
from rest_framework.response import Response
from rest_framework import serializers
class BookModelSerializers(serializers.ModelSerializer): # 类似于 modelform 一样的操作
class Meta:
model = Book
fields = "__all__"
# fields = ['publist','authors','title',] # 也可以单独取部分字段 # 默认转换的时候普通字段没啥问题
# title = serializers.CharField # 对于普通字段直接取即可 默认是 取 str(obj.title ) # 对于一对一,一对多字段会有错误的显示
# publish= serializers.CharField() # 会显示对象
# publish_id = serializers.CharField() # 会显示id ,如果没有非要要求显示特定字段,直接全部 __all__ 即可。
# 自定义对一对多字段处理 ,注意啊:自定义字段可别写在 Meta 里面。是类下的变量字段。
publish = serializers.CharField(source="publish.pk") # 加 "source=" 取 str(obj.publish.pk )
# 给字段的赋值一个 url 地址 ,即 Hyperlinked
publish=serializers.HyperlinkedIdentityField(
view_name="detailpublish", # 反向解析的 别名
lookup_field="publish_id", # 找出来当前的 id 值
lookup_url_kwarg="pk" # 将lookup_field 的值赋值给 url 中
)
# 如果使用了超链接,url 的格式如下, 必须需要有 反向名字,分组命名。
# url(r'publish/(?P<pk>\d+)', views.BookDetailView.as_view(),name="detailpublish"), # 如果使用了超链接,序列化示例的时候必须要加 context={"request":request}参数。
# bs=BookModelSerializers(book_list,many=True,context={'request': request})
# authors = serializers.SerializerMethodField(source='authors.all') # 这样查多对多会查出来 queryset 对象
# 自定义对多对多字段的处理
authors = serializers.SerializerMethodField()
def get_authors(self,obj): # 自定义多对多的处理,方法名有要求: get_字段名字
temp=[]
for obj in obj.authors.all():
temp.append(obj.name)
return temp
# 如果自定义了字段的处理 ,需要重写 create 方法
def create(self, validated_data):
book=Book.objects.create(
title=validated_data["title"],
price=validated_data["price"],
pub_date=validated_data["pub_date"],
publish_id=validated_data["publish"]["pk"]
)
book.authors.add(*validated_data["authors"])
return book
序列化的使用
路由
url(r'book/', views.BookView.as_view()),
url(r'book/(\d+)', views.BookDetailView.as_view()),
视图
class BookView(APIView):
def get(self,request): # 对所有数据进行查看
book_list=Book.objects.all()
bs=BookModelSerializers(book_list,many=True,context={'request': request}) # 如果使用了了返回超链接就必须要加 context参数
return Response(bs.data) def post(self,request): # 对数据进行创建提交
# post请求的数据
bs=BookModelSerializers(data=request.data)
if bs.is_valid():
print(bs.validated_data)
bs.save() # .create()方法
return Response(bs.data)
else:
return Response(bs.errors) class BookDetailView(APIView):
def get(self,request,id): # 对单条数据进行查看 book=Book.objects.filter(pk=id).first()
bs=BookModelSerializers(book,context={'request': request})
return Response(bs.data) def put(self,request,id): # 对单条数据进行更新
book=Book.objects.filter(pk=id).first()
bs=BookModelSerializers(book,data=request.data)
if bs.is_valid():
bs.save() # .updata()
return Response(bs.data)
else:
return Response(bs.errors) def delete(self,request,id): # 删除数据
Book.objects.filter(pk=id).delete()
return Response()
rest framework 序列化的更多相关文章
- Django REST Framework序列化器
Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...
- rest framework 序列化之depth遇到用户表外键的尴尬情况
rest framework 序列化之depth遇到用户表外键的尴尬情况 问题:ModelSerializer序列化使用depth=1直接扩表把用户表所有信息查询出来的情况 class xxxSeri ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- Django REST framework序列化
一.简介 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官网:https://www.djang ...
- Django Rest framework序列化流程
目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...
- 02 Django REST Framework 序列化
01-创建序列化类 # 方式一: publish_list = models.Publish.objects.all() # 导入序列化组件 from django.core import seria ...
- python学习-- Django REST framework 序列化数据操作
一.为什么要返回json数据? 一般来说前端要用到从后台返回的数据来渲染页面的时候,这时候后台就需要向前端返回json类型的数据,简单直观便于理解 ,就类似于 {"xxx":{[& ...
- Django REST Framework 序列化和校验 知识点
DRF序列化 Django ORM对象 --> JSON格式的数据 序列化 JSON格式的数据 --> Django ORM数据 反序列化 需要两个工具: from rest_framew ...
- django rest framework 序列化组件总结
序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...
随机推荐
- Dynamics 365使用代码发送邮件给指定邮箱地址
摘要: 微软动态CRM专家罗勇 ,回复303或者20190213可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 当然,首先要 ...
- JMeter中文返回乱码
JMeter中文返回乱码 结果树响应数据中文返回乱码 其实有几个方法: 在线程组->http请求的字符集里设置 在http 消息管理头中设置 3.如果以上方法还没有解决,请打开安装目录 ...
- DVWA 黑客攻防演练(五)文件上传漏洞 File Upload
说起文件上传漏洞 ,可谓是印象深刻.有次公司的网站突然访问不到了,同事去服务器看了一下.所有 webroot 文件夹下的所有文件都被重命名成其他文件,比如 jsp 文件变成 jsp.s ,以致于路径映 ...
- Linux中VSFTP的配置
配置VSFTP服务器: 1.安装VSFTP,可以参考Linux 中yum的配置来安装: yum installvsftpd.x86_64 -y 2.修改SELinux: setenforce 0 查看 ...
- 解决sqlserver数据库显示单个用户
今天突然发现数据库显示为单个用户并且,访问速度超慢,执行以下语句解决了 USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQ ...
- c/c++ 多线程 参数传递
多线程 参数传递 1,值传递,拷贝一份新的给新的线程.线程1中有个int变量a,在线程1中启动线程2,参数是a的值,这时就会拷贝a,线程1和线程2不共享a. 2,引用传递,不拷贝一份新的给新的线程.线 ...
- RX 和 TX
我们在ifconfig 查看网卡配置时或者嵌入式开发的时候,经常会看到rx/tx缩写,其含义如下: RX==receive,接收,从开启到现在接收封包的情况,是下行流量. TX==Transmit,发 ...
- laravel部署创建新项目 助记
打开进入homestead虚拟机,并进入code文件夹 cd ~/homestead && vagrant up && vagrant ssh cd ~/Code 进行 ...
- LeetCode算法题-Find Mode in Binary Search Tree(Java实现)
这是悦乐书的第246次更新,第259篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第113题(顺位题号是501).给定具有重复项的二叉搜索树(BST),找到给定BST中的 ...
- 力扣算法题—079单词搜索【DFS】
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...