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统计字符串中指定字符出现次数的方法
Apr 04 Python
在Python中使用mongoengine操作MongoDB教程
Apr 24 Python
详解Django中的form库的使用
Jul 18 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
python+django快速实现文件上传
Oct 24 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
python中正则表达式的使用方法
Feb 25 Python
Python rstrip()方法实例详解
Nov 11 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
什么是Python中的匿名函数
Jun 02 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 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
在Zeus Web Server中安装PHP语言支持
2006/10/09 PHP
PHP高级OOP技术演示
2009/08/27 PHP
php获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
PHP递归算法的简单实例
2019/02/28 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
js实现超简单的展开、折叠目录代码
2015/08/28 Javascript
angular.bind使用心得
2015/10/26 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
Node.js的特点详解
2017/02/03 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
Python入门学习之字符串与比较运算符
2015/10/12 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
Python装饰器简单用法实例小结
2018/12/03 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
Python3远程监控程序的实现方法
2019/07/15 Python
Python 如何实现访问者模式
2020/07/28 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
经营理念口号
2014/06/21 职场文书
比赛主持人开场白
2015/05/29 职场文书
药房管理制度范本
2015/08/06 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
工厂无线对讲系统解决方案
2022/02/18 无线电