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 相关文章推荐
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
python插入排序算法实例分析
Jul 03 Python
python装饰器与递归算法详解
Feb 18 Python
windows下ipython的安装与使用详解
Oct 20 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
对python sklearn one-hot编码详解
Jul 10 Python
Flask之请求钩子的实现
Dec 23 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
Python爬虫爬取新闻资讯案例详解
Jul 14 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
编写python代码实现简单抽奖器
Oct 20 Python
想学画画?python满足你!
Dec 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
mysql下创建字段并设置主键的php代码
2010/05/16 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
深入理解PHP之OpCode原理详解
2016/06/01 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
深入理解Javascript中的循环优化
2013/11/09 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
vue获取dom元素注意事项
2017/12/28 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
python str与repr的区别
2013/03/23 Python
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
简单讲解Python中的闭包
2015/08/11 Python
利用python实现数据分析
2017/01/11 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python opencv摄像头的简单应用
2019/06/06 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
python实现简单的购物程序代码实例
2020/03/03 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
20年同学聚会邀请函
2014/02/04 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Pytorch DataLoader shuffle验证方式
2021/06/02 Python