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功能键的读取方法
May 28 Python
谈谈如何手动释放Python的内存
Dec 17 Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 Python
python调用百度语音识别api
Aug 30 Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 Python
python如何读取bin文件并下发串口
Jul 05 Python
Django 项目通过加载不同env文件来区分不同环境
Feb 17 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
Python 如何在字符串中插入变量
Aug 01 Python
Python实战之实现简易的学生选课系统
May 25 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
东方红 - 来复式再生机的修复
2021/03/02 无线电
Codeigniter注册登录代码示例
2014/06/12 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
js的一些常用方法小结
2011/06/29 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
RequireJs的使用详解
2017/02/19 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
python操作redis的方法
2015/07/07 Python
Python使用xlwt模块操作Excel的方法详解
2018/03/27 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
详解HTML5中的manifest缓存使用
2015/09/09 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
报到证丢失证明
2014/01/11 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
会计工作能力自我评价
2015/03/05 职场文书
2015年工会工作总结
2015/03/30 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
如何使用python包中的sched事件调度器
2022/04/30 Python