rest_framework

简介

Django REST框架是一个功能强大且灵活的工具包,用于构建Web API。

官方网站:https://www.django-rest-framework.org

安装与加载

pip install djangorestframework
INSTALLED_APPS = [
...,
'rest_framework'
]

序列化与反序列化流程

反序列化流程

反序列化流程 是从前端提交数据到数据库的流程。

graph LR
web提交数据 --> get/post...请求
get/post...请求 --> to_internal_value
to_internal_value --> 序列化映射
序列化映射 --> 自定义字段验证
自定义字段验证 --> 对象级别验证
对象级别验证 --> action
action --> to_representation

序列化流程

序列化是将数据从数据库提交到前端的过程。

graph LR
QuerySet --> serializer
serializer --> to_representation
to_representation --> 前端

序列化模型

创建 serializers.py文件

from rest_framework import serializers
from .models import Idc class IdcSerializer(serializers.Serializer):
"""
Idc 序列化类
"""
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(required=True, max_length=32)
address = serializers.CharField(required=True, max_length=256)
phone = serializers.CharField(required=True, max_length=15)
email = serializers.EmailField(required=True, max_length=50)
letter = serializers.CharField(required=True, max_length=5) ### 定义create 与update 为反序列化准备
def create(self, validated_data):
return Idc.objects.create(**validated_data) def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.address = validated_data.get("address", instance.name)
instance.phone = validated_data.get("phone", instance.name)
instance.email = validated_data.get("email", instance.name)
instance.save()
return instance

序列与反序列化方法

from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
from rest_framework.renderers import JSONRenderer ## 序列化
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
ret = JSONRenderer().render(serializer) ## 反序列化
## content 前端传入的byte 型字符串 stream = BytesIO(content)
data = JSONParser().parse(stream) serialize1 = IdcSerializer(data=data)
# 验证数据合法性
serialize1.is_valid()
# 保存数据
serialize1.save()
# 获取合法数据
serialize1.validated_data

view 逻辑实现

from .models import Idc
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response
from .serializers import IdcSerializer # ################ 版本2 ################
# 使用api_view 限制请求方式, 使用Response 简化序列化流程 @api_view(["GET", "POST"])
def idc_list(request, *args, **kwargs):
if request.method == "GET":
print(request.path)
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
return Response(serializer.data)
if request.method == "POST":
serializer = IdcSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST) @api_view(["GET", "PUT"])
def idc_detail(request, pk, *args, **kwargs):
try:
queryset = Idc.objects.get(pk=pk)
except:
return Response(status=status.HTTP_404_NOT_FOUND) if request.method == "GET":
serializer = IdcSerializer(queryset)
return Response(serializer.data)
if request.method == "PUT":
serializer = IdcSerializer(queryset, data=request.data) if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_202_ACCEPTED)
return Response(status=status.HTTP_400_BAD_REQUEST) # ################ 版本3 ################
# 使用类视图进行改写 from rest_framework.views import APIView
from django.http import Http404 class IdcList(APIView):
def get(self, request, format=None):
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
return Response(serializer.data) def post(self, request, format=None):
serializer = IdcSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST) class IdcDetail(APIView): def get_obj(self, pk):
try:
Idc_obj = Idc.objects.get(pk=pk)
return Idc_obj
except Idc.DoesNotExist:
raise Http404 def get(self, request, pk, format=None):
queryset = self.get_obj(pk)
serializer = IdcSerializer(queryset)
return Response(serializer.data) def post(self, request, pk, format=None): queryset = self.get_obj(pk)
serializer = IdcSerializer(queryset, data=request.data) if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_202_ACCEPTED)
return Response(status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None):
queryset = self.get_obj(pk)
queryset.delete()
return Response(status.HTTP_204_NO_CONTENT) # ################ 版本6 ################
# 使用混合, 将所有请求方法定义在一个视图下 from rest_framework import viewsets class IdcListV6(viewsets.GenericViewSet,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
mixins.CreateModelMixin
):
queryset = Idc.objects.all()
serializer_class = IdcSerializer # ################ 版本7 ################
# 简化继承关系 from rest_framework import viewsets class IdcViewSetV7(viewsets.ModelViewSet):
queryset = Idc.objects.all()
serializer_class = IdcSerializer
from rest_framework.routers import DefaultRouter

注册接口

from rest_framework.routers import DefaultRouter
route = DefaultRouter()
route.register("idcs", views.IdcViewSetV7)
urlpatterns = [
url(r'^', include(route.urls))
]

rest_framework 学习笔记(一)的更多相关文章

  1. Django RF:学习笔记(8)——快速开始

    Django RF:学习笔记(8)——快速开始 安装配置 1.使用Pip安装Django REST Framework: pip install djangorestframework 2.在Sett ...

  2. Django:学习笔记(3)——REST实现

    Django:学习笔记(3)——REST实现 了解REST风格 按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下 web/deleteB ...

  3. Vue学习笔记-rest_framework_jwt 学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  4. Vue学习笔记-Django REST framework3后端接口API学习

    一  使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7  (Windows x86- ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. 【python爬虫】 爬云音乐我和xxx共同听过的歌曲

    闲聊的时候,觉得,想写个爬虫,爬下2个人共同听过的歌曲有哪些,然后一鼓作气,花了一个多小时,写了一个.支持最近一周和所有时间,需要用户没有关闭听歌排行显示 How to start 使用到的工具是Se ...

  2. BZOJ 1283: 序列 (最大费用流)

    题意 有n个正整数,要选取里面的一些数,在保证每m个连续的数中最多选k个的情况下,使得得到的值最大. 分析 我们可以把问题先转化为选k次,每一次每m个数只能选一个.那么根据贪心的策略,每m个里一定会选 ...

  3. [Javascript] Correctly Type-Checking Numbers

    There are two ways to correctly type checks number: console.log(typeof 99.66); // number console.log ...

  4. [Cypress] Use the Most Robust Selector for Cypress Tests

    Which selectors your choose for your tests matter, a lot. In this lesson, we'll see the recommended ...

  5. 灰度变换,gama变换,对数,反对数变换

    学习DIP第2天 灰度变换,及按照一定规则对像素点的灰度值进行变换,变换的结果可以增强对比度,或者达到其他的效果(例如二值化,或者伽马变换),由于灰度变换为针对单个像素点的灰度值进行变换,素以算法复杂 ...

  6. elastic search&logstash&kibana 学习历程(三)Logstash使用场景和安装部署

    Logstash基本介绍和使用场景 自我认为:logstash就是日志的采集收集,日志的搬运工,实时去采集日志.读取不同的数据源,并进行过滤,开发者自定义规范输出到目的地.日志的来源很多,如系统日志, ...

  7. php shmop windows 信号量锁

    if (!function_exists('sem_get')) { function sem_get($key) { return fopen(__FILE__ . '.sem.' . $key, ...

  8. 【java设计模式】-04单例模式

    单例模式 定义: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型: 创建类模式 类图: 单例模式特点 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单 ...

  9. JVM GC之垃圾收集算法

    1.垃圾收集概念 GC目的 分配内存,为每个新建的对象分配空间 确保还在使用的对象的内存一直还在,不能把有用的空间当垃圾回收了 释放不再使用的对象所占用的空间 我们把还被引用的对象称为活的,把不再被引 ...

  10. JavaWeb_(Mybatis框架)使用Mybatis对表进行增、删、改、查操作_二

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...