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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
python 写的一个爬虫程序源码
Feb 28 Python
Python使用Pycrypto库进行RSA加密的方法详解
Jun 06 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
python3中str(字符串)的使用教程
Mar 23 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 Python
浅谈django channels 路由误导
May 28 Python
python matplotlib绘制三维图的示例
Sep 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
重置版游戏视频
2020/04/09 魔兽争霸
PHP中Session的概念
2006/10/09 PHP
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
小谈php正则提取图片地址
2014/03/27 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
php生成word并下载代码实例
2019/03/15 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
使用pjax实现无刷新更改页面url
2015/02/05 Javascript
使用JavaScript制作一个简单的计数器的方法
2015/07/07 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
python根据多个文件名批量查找文件
2019/08/13 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
利用python在excel中画图的实现方法
2020/03/17 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
django中ImageField的使用详解
2020/12/21 Python
如何编写python的daemon程序
2021/01/07 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
经济系大学生求职信
2013/10/01 职场文书
市场开发与营销专业求职信范文
2014/05/01 职场文书
学校节能减排倡议书
2014/05/16 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
银行培训心得体会范文
2016/01/09 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python