drf 之序列化组件
序列化
把Python中对象转换为json格式字符串
反序列化
把json格式转为为Python对象。
用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串。
序列化两大功能:
对请求数据进行验证
对Queryset对象进行序列化
一、Django自带序列化组件
略
二、rest framework序列化之Serializer
使用方式如下:
建表 models.py
from django.db import models # Create your models here. class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
def __str__(self):
return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
views
写一个restframework接口拿到数据(所有图书)
方式一:如果没有序列化组件的话,要先转成字典,然后再用json.dumps()再转。
方式二:用序列化组件。
首先你要序列化谁,先写一个类。这个类继承一个东西,然后用的时候,在视图类中直接用这个类生成一个对象。
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response # Create your views here. from api import models # 想用这个类,需要导入
from api.MySerializer import BookSerializer class BookView(APIView): def get(self,request,*args,**kwargs):
ret = {
'code':100,
'msg':'成功了'
}
books = models.Book.objects.all()
# 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
books_ser = BookSerializer(instance=books,many=True)
# 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
# books_ser.data 就是序列化后的结果 是个字典
print(books_ser.data)
ret['books']=books_ser.data
# return Response(books_ser.data)
return Response(ret)
写的格式化的类在另外的文件夹或文件:
# 自己写一个序列化的类
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
id = serializers.CharField()
title = serializers.CharField()
price = serializers.CharField()
在线格式化json
https://www.json.cn
获取一本id为3的书 http://127.0.0.1:8000/book/3
路由:
from api import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/$', views.BookView.as_view()),
url(r'^book/(?P<id>\d+)$', views.Book.as_view()),
]
视图:
from django.shortcuts import render,HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response # Create your views here. from api import models # 想用这个类,需要导入
from api.MySerializer import BookSerializer class BookView(APIView): def get(self,request,*args,**kwargs):
ret = {
'code':100,
'msg':'成功了'
}
books = models.Book.objects.all()
# 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
books_ser = BookSerializer(instance=books,many=True)
# 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
# books_ser.data 就是序列化后的结果 是个字典
print(books_ser.data)
ret['books']=books_ser.data
# return Response(books_ser.data)
return Response(ret) class Book(APIView):
def get(self,requst,id):
ret = {
'code': 100,
'msg': '成功了'
} book = models.Book.objects.filter(pk=id).first()
book_ser = BookSerializer(instance=book,many=False)
ret['book']=book_ser.data
return Response(book_ser.data)
如果序列化加个publish字段 (外键关联的)
拿到的是 "publish": "Publish object"
如果想显示出版社的名字,拿到出版社的id
可以通过source来改名!
变量名和source指定的值不能一样。
source还支持继续点(字段)还支持方法
序列化的类:
# 自己写一个序列化的类
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
id = serializers.CharField() # title = serializers.CharField()
name = serializers.CharField(source='title') price = serializers.CharField() publish_name = serializers.CharField(source='publish.name')
publish_id = serializers.CharField(source='publish.pk')
拿出出版社所有的东西:SerializerMethodField()
意思是支持SerializerMethodField()这个方法,并且把返回值赋值给字段
固定写法:get_这个字段名字,里面有个参数obj,这个obj就是当前对象。
# 自己写一个序列化的类
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
# 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写 publish_dic = serializers.SerializerMethodField() def get_publish_dic(self, obj):
#意思是支持SerializerMethodField()这个方法,并且把返回值赋值给publish_dic
return {'id':obj.publish.pk,'name':obj.publish.name,'email':obj.publish.email}
多对多的表关系:
drf 之序列化组件的更多相关文章
- 第三章、drf框架 - 序列化组件 | Serializer
目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...
- DRF的序列化组件
目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...
- Django框架(十八)—— drf:序列化组件(serializer)
序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primary_ke ...
- drf框架 - 序列化组件 | Serializer
序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...
- Django框架(十九)—— drf:序列化组件(serializer)
目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 ...
- DRF(3) - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...
- drf之序列化组件(一):Serializer
序列化组件:Serializer.ModelSerializer.ListModelSerializer Serializer 偏底层 ModelSerializer 重点 List ...
- drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)
ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...
- DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
随机推荐
- postgresql命令
连接数据库, 默认的用户和数据库是postgrespsql -U user -d dbname 切换数据库,相当于mysql的use dbname\c dbname列举数据库,相当于mysql的sho ...
- java8 流操作
0 创建流 public void test1(){ List<String> list = new ArrayList<>(); Stream<String> ...
- mac下进行连接pptp协议
环境:mac系统 软件:shimo 协议:pptp协议 说明: mac 自带vpn已经不支持 pptp协议的vpn,可以下载shimo连接. mac下进行vpn连接pptp协议操作方法: 下载: 链接 ...
- jenkins进行andriod打包,上传蒲公英
环境:macos jenkins sdk gradle 1.构建操作注意: mac电脑上 选择invoke gradle task数值是:clean 2.再创建一个task 然后进行gradle加参数 ...
- Kali-linux使用Metasploit基础
Metasploit是一款开源的安全漏洞检测工具.它可以帮助用户识别安全问题,验证漏洞的缓解措施,并对某些软件进行安全性评估,提供真正的安全风险情报.当用户第一次接触Metasploit渗透测试框架软 ...
- 洛谷 P2404 自然数的拆分问题
题目链接 https://www.luogu.org/problemnew/show/P2404 题目背景 木有...... 题目描述 任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和. ...
- face detection[FaceBoxes]
该文来自<FaceBoxes: A CPU Real-time Face Detector with High Accuracy>.该文时间线是2018年1月 虽然人脸检测上随着深度学习的 ...
- Android root检测方法小结
转载目的,之前主要应用这里的原理解决了,手机被某个APP检测为root过的手机的问题,记录后续可能参考. 出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root ...
- 联合索引在B+树上的结构
一级索引 二级联合索引 假设这是一个多列索引(col1, col2,col3),对于叶子节点,是这样的: PS:该图改自<MySQL索引背后的数据结构及算法原理>一文的配图. 也就是说, ...
- JS表格分页(封装版)
HTML代码: <html> <head> <meta charset='utf-8'> <script type="text/javascript ...