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的Flask框架与数据库连接的教程
Apr 20 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
利用Python获取操作系统信息实例
Sep 02 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
python实现壁纸批量下载代码实例
Jan 25 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
Pytorch: 自定义网络层实例
Jan 07 Python
TensorFLow 变量命名空间实例
Feb 11 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
Django中的DateTimeField和DateField实现
Feb 24 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 强制下载文件代码
2010/10/24 PHP
新手学习PHP的一些基础知识分享
2011/07/27 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
详解Vue中添加过渡效果
2017/03/20 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
2019/11/01 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
python中函数传参详解
2016/07/03 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python实现随机选择元素功能
2017/09/14 Python
python去掉空白行的多种实现代码
2018/03/19 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
什么是继承
2013/12/07 面试题
甜点店创业计划书
2014/01/27 职场文书
党组织公开承诺书
2014/03/29 职场文书
初中生期末评语大全
2014/04/24 职场文书
2014年财务部工作总结
2014/11/11 职场文书
2015年党员承诺书
2015/01/21 职场文书
护理专业自我评价
2015/03/11 职场文书
党章学习心得体会2016
2016/01/14 职场文书