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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
windows下wxPython开发环境安装与配置方法
Jun 28 Python
Python中返回字典键的值的values()方法使用
May 22 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
浅谈flask源码之请求过程
Jul 26 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
用Python生成HTML表格的方法示例
Mar 06 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 Python
用 Python 元类的特性实现 ORM 框架
May 19 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
基于mysql的论坛(4)
2006/10/09 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
JavaScript 封装Ajax传递的数据代码
2009/06/05 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
react build 后打包发布总结
2018/08/24 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
2020/10/30 Javascript
[01:51]历届DOTA2国际邀请赛举办地回顾 TI9落地上海
2018/08/26 DOTA
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python中使用不同编码读写txt文件详解
2015/05/28 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
python合并同类型excel表格的方法
2018/04/01 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
python实现登录与注册系统
2020/11/30 Python
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
python re模块和正则表达式
2021/03/24 Python
2014年残疾人工作总结
2014/12/06 职场文书
创业计划书之网吧
2019/10/10 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers