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修改注册表终止360进程实例
Oct 13 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
利用python代码写的12306订票代码
Dec 20 Python
Python图算法实例分析
Aug 13 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python猴子补丁知识点总结
Jan 05 Python
Python中sorted()排序与字母大小写的问题
Jan 14 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
Oct 22 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
ThinkPHP模板输出display用法分析
2014/11/26 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python如何获取服务器硬件信息
2017/05/11 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
Python ellipsis 的用法详解
2020/11/20 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
饮料业务员岗位职责
2013/12/15 职场文书
2014年计算机专业个人自我评价
2014/01/19 职场文书
高三毕业寄语
2014/04/10 职场文书
网吧管理制度范本
2015/08/05 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server