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中的并发编程实例
Jul 07 Python
Python下rrdtool模块的基本使用方法
Nov 13 Python
Python 实现购物商城,含有用户入口和商家入口的示例
Sep 15 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
详解Python字典的操作
Mar 04 Python
python抓取需要扫微信登陆页面
Apr 29 Python
pyQt5实时刷新界面的示例
Jun 25 Python
Django框架表单操作实例分析
Nov 04 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
Python读取文件夹下的所有文件实例代码
Apr 02 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
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
2010/07/25 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
javascript实用方法总结
2015/02/06 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
vue实现通讯录功能
2018/07/14 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
简单的Python抓taobao图片爬虫
2014/10/26 Python
python实现bucket排序算法实例分析
2015/05/04 Python
Python探索之修改Python搜索路径
2017/10/25 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
python dict乱码如何解决
2020/06/07 Python
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
写求职信要注意什么问题
2014/04/12 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
2014年优秀党员材料
2014/12/18 职场文书
研究生导师评语
2014/12/31 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
MySQL中order by的使用详情
2021/11/17 MySQL
一文简单了解MySQL前缀索引
2022/04/03 MySQL