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和MD5实现网站挂马检测程序
Mar 13 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
python manage.py runserver流程解析
Nov 08 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 Python
Django如何实现密码错误报错提醒
Sep 04 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 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
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
浅析Ajax语法
2016/12/05 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
DJI大疆德国官方商城:大疆无人机
2018/09/01 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
酒店节能减排方案
2014/05/26 职场文书
十八大标语口号
2014/10/09 职场文书
学生个人总结范文
2015/02/15 职场文书
入党自荐书范文
2015/03/05 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
离婚起诉状范本
2015/05/19 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers