Django REST framework 视图和路由详解


Posted in Python onJuly 19, 2019

DRF中的Request

在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等。

比如,区别于Django中的request从request.GET中获取URL参数,从request.POST中取某些情况下的POST数据。

在APIView中封装的request,就实现了请求数据的解析:

对于GET请求的参数我们通过request.query_params来获取。

对于POST请求、PUT请求的数据我们通过request.data来获取。

前提

序列化

from rest_framework import serializers
from app01 import models


class CommentSerializer(serializers.ModelSerializer):
  class Meta:
    model = models.Comment
    fields = "__all__"
    extra_kwargs = {
      "content": {"error_messages": {"required": "评论内容不能为空"}},
      "article": {"error_messages": {"required": "文章不能为空"}}
    }


class SchoolSerializer(serializers.ModelSerializer):
  class Meta:
    model = models.School
    fields = "__all__"

第一阶段:手垒代码

视图

from rest_framework.views import APIView
class SchoolView(APIView):
  def get(self, request, *args, **kwargs):
    query_set = models.School.objects.all()
    ser_obj = app01_serializers.SchoolSerializer(query_set, many=True)
    return Response(ser_obj.data)


class SchoolDetail(APIView):
  def get(self, request, pk, *args, **kwargs):
    obj = models.School.objects.filter(pk=pk).first()
    ser_obj = app01_serializers.SchoolSerializer(obj)
    return Response(ser_obj.data)

第二阶段:简单使用rest formwork自带混合类方法

视图

from rest_framework.generics import GenericAPIView # 公共类
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin # 混合类 必须与公共类搭配着使用

class SchoolView(GenericAPIView, mixins.ListModelMixin): # 查看学校列表
  queryset = models.School.objects.all()
  serializer_class = app01_serializers.SchoolSerializer

  def get(self, request, *args, **kwargs):
    return self.list(request, *args, **kwargs)


class SchoolDetail(GenericAPIView, mixins.RetrieveModelMixin, mixins.CreateModelMixin): # 创建,与具体查出某一条记录
  queryset = models.School.objects.all()
  serializer_class = app01_serializers.SchoolSerializer

  def get(self, request, pk, *args, **kwargs):
    return self.retrieve(request, pk, *args, **kwargs)

  def post(self, request, *args, **kwargs):
    return self.create(request, *args, **kwargs)

路由

url(r'school/$', views.SchoolView.as_view()),
url(r'school/(?P<pk>\d+)/$', views.SchoolDetail.as_view()),

第三阶段:使用rest formwork自带的通用类方法

视图

from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateAPIVie
class SchoolView(ListCreateAPIView): # 创建
  queryset = models.School.objects.all()
  serializer_class = app01_serializers.SchoolSerializer


class SchoolDetail(RetrieveUpdateDestroyAPIView): # 更新
  queryset = models.School.objects.all()
  serializer_class = app01_serializers.SchoolSerializer

路由同上

第四阶段:使用rest formwork自带的封装所有放的类,代码量最少,功能最全

视图

from rest_framework.viewsets import ModelViewSet # 里面封装了操作的所有方法,增删改查查
class SchoolView(ModelViewSet):
  queryset = models.School.objects.all()
  serializer_class = app01_serializers.SchoolSerializer

路由

url(r'school/$', views.SchoolView.as_view(actions={
  "get": "list",
  "post": "create",
})),
url(r'school/(?P<pk>\d+)/$', views.SchoolView.as_view(actions={
  'get': 'retrieve',
  'put': 'update',
  'patch': 'partial_update',
  'delete': 'destroy'
})),

高级路由

视图

同上

路由

from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'school', views.SchoolView)
urlpatterns += router.urls

精华:流程图

Django REST framework 视图和路由详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
python pygame实现挡板弹球游戏
Nov 25 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
Python描述符descriptor使用原理解析
Mar 21 Python
Python list列表删除元素的4种方法
Nov 01 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 #Python
Django模板Templates使用方法详解
Jul 19 #Python
python GUI图形化编程wxpython的使用
Jul 19 #Python
Django 外键的使用方法详解
Jul 19 #Python
python原类、类的创建过程与方法详解
Jul 19 #Python
Django 全局的static和templates的使用详解
Jul 19 #Python
python之拟合的实现
Jul 19 #Python
You might like
PHP中获取文件扩展名的N种方法小结
2012/02/27 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
javascript基于DOM实现省市级联下拉框的方法
2015/05/14 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
python实现读取命令行参数的方法
2015/05/22 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
python自动化报告的输出用例详解
2018/05/30 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
李培根演讲稿
2014/05/22 职场文书
党员检讨书
2014/10/13 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android