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命名空间详解
Aug 18 Python
python保存网页图片到本地的方法
Jul 24 Python
详解Django-channels 实现WebSocket实例
Aug 22 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
详解Python IO口多路复用
Jun 17 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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 mkdir()定义和用法
2009/01/14 PHP
PHP学习之正则表达式
2011/04/17 PHP
Laravel 队列使用的实现
2019/01/08 PHP
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
Python实现二维数组输出为图片
2018/04/03 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
2014年工程工作总结
2014/11/25 职场文书
离职信范文
2015/06/23 职场文书
婚宴主持词
2015/06/30 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
Python常遇到的错误和异常
2021/11/02 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫