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中,只有 ...
随机推荐
- 解决新版chrome无法手动拖动安装插件 提示“无法从该网站添加应用,扩展程序和用户脚本”
开发模式安装 把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar 解压压缩文件 在Chrome的地址栏中输入:chrome://extensions/ 打开Chrome ...
- python六十八课——网络编程之UDP协议
1.1 概述 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接.简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到 ...
- UVA12107-Digit Puzzle(迭代加深搜索)
Problem UVA12107-Digit Puzzle Accept:85 Submit:612 Time Limit: 3000 mSec Problem Description Inpu ...
- Python:Day28 同步锁
同步锁: Python不是有一把锁了吗?为什么还要加锁? Python解释器的GIL的作用是同一时刻只有一个线程被CPU执行,而同步锁的作用同一时刻只有一个线程对锁定代码块操作 如果不加锁,当多个线程 ...
- Bean named '*' must be of type [*], but was actually of type []
本地Service 名字和调用别的maven项目Service重名
- WiFi-ESP8266入门http(1)-建立服务器,直接发送网
#include <ESP8266WiFi.h> /*** 该工程可以在2.4.0版本esp8266库中运行,没在更高版本库中进行测试 ***/ const char *ssid = &q ...
- 07 Python初学(元组)
tuple: 元组被称为只读列表,即数据可以被查询,但不能被修改,列表的切片操作同样适用于元组. 元组写在小括号()里,元素之间用逗号隔开 虽然 tuple 的元素不可改变,但他可以包含可变的对 ...
- 05 python 初学(列表)
列表,有点像c++里的数组 # _author: lily # _date: 2018/12/16 mylist = ["xiaohong", "xiaogang&quo ...
- ganache与metamask
1.其实ganache其实就相当于一个私有链ganache安装,这个是图形化界面的: 2.(testRpc跟他其实是一个用处,有一个即可,只不过testRpc是非图形化界面.要注意两者都仅运行在內存中 ...
- day26 Python isinstance和issubclass
isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo(object) ...