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中,只有 ...
随机推荐
- PHP程序员的能力水平层次
PHP程序员的能力水平层次 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点. 下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开 ...
- JavaScript中浅拷贝和深拷贝的区别和实现
深拷贝和浅拷贝的区别 浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存: 深拷贝(deep copy):复制并创建一个一摸一样的对象,不共 ...
- 「JOI 2016 Final」断层
嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...
- 转://因触发器限制导致oracle用户登录失败
使用PL/SQL DEV登录数据库时,出现如下错误 手工创建了test用户,通过dev工具登录没问题.怀疑数据库中有些用户限制了登录的.再看错误编号:ORA-20001,oracle保留的异常错误号范 ...
- flash设置里面:您的 Flash 设置会一直保留到您退出 Chrome 为止。
疑问:flash设置里面:您的 Flash 设置会一直保留到您退出 Chrome 为止. 我记得以前的版本配置后就一直用啊,允许的就可以一直允许,现在这个sb版本退出后就恢复到默认,允许列表的网站就清 ...
- 【转】Android hdpi ldpi mdpi xhdpi xxhdpi适配详解
1.了解几个概念(1)分辨率.分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800.720×1280.1080×1920等.720×1280表示此屏幕在宽 ...
- 【vue】vue中实现导出excel
1.安装依赖 cnpm install -S file-saver xlsx cnpm install -D script-loader 2.例如在src文件夹中新建一个名为vendor(vendor ...
- 吴恩达课后作业学习2-week2-优化算法
参考:https://blog.csdn.net/u013733326/article/details/79907419 希望大家直接到上面的网址去查看代码,下面是本人的笔记 我们需要做以下几件事: ...
- Ubuntu 14.04 安装 CUDA 问题及解决
本文安装环境: - 双显卡: intel 集显 + nvidia 独显 - Ubuntu 14.04.4 - CUDA 8.0.44 1. Deb 安装包是个坑 (不要用这种方法!) 使用 Deb 安 ...
- Windows解压安装mysql 5.7.24,并部署多个mysql服务
mysql官网windows安装文档 https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html 第一步,选择安装包 htt ...