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中open()函数指定文件打开方式的用法
Jun 04 Python
python魔法方法-自定义序列详解
Jul 21 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
Python正则表达式经典入门教程
May 22 Python
Python爬虫之模拟知乎登录的方法教程
May 25 Python
python实现图片识别汽车功能
Nov 30 Python
Python爬取365好书中小说代码实例
Feb 28 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
Django中FilePathField字段的用法
May 21 Python
python温度转换华氏温度实现代码
Dec 06 Python
5道关于python基础 while循环练习题
Nov 27 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
投票管理程序
2006/10/09 PHP
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
JsDom 编程小结
2011/08/09 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
简单的分页代码js实现
2016/05/17 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
Python KMeans聚类问题分析
2018/02/23 Python
Python iter()函数用法实例分析
2018/03/17 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python 使用多属性来进行排序
2019/09/01 Python
关于numpy数组轴的使用详解
2019/12/05 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python列表如何更新值
2020/05/27 Python
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
测试工程师职业规划书
2014/02/06 职场文书
超市国庆节促销方案
2014/02/20 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
fastdfs+nginx集群搭建的实现
2021/03/31 Servers
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python