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 相关文章推荐
Python2.5/2.6实用教程 入门基础篇
Nov 29 Python
python进阶教程之文本文件的读取和写入
Aug 29 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
Python下载懒人图库JavaScript特效
May 28 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
微信跳一跳python代码实现
Jan 05 Python
Python File readlines() 使用方法
Mar 19 Python
python读取和保存视频文件
Apr 16 Python
Python实现钉钉发送报警消息的方法
Feb 20 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
Python中random模块常用方法的使用教程
Oct 04 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 在文件指定行插入数据的代码
2010/05/08 PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php文件下载处理方法分析
2015/04/22 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
javascript整除实现代码
2010/11/23 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
Python Tkinter简单布局实例教程
2014/09/03 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
UNIX文件类型
2013/08/29 面试题
师范大学音乐表演专业求职信
2013/10/23 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
户籍证明格式
2014/09/15 职场文书
2015年班组工作总结
2015/04/20 职场文书
消防隐患整改通知书
2015/04/22 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
Python各协议下socket黏包问题原理
2022/04/12 Python