Warninig:本文仅适用小白,老手请绕道

总共,分三步

对于一个从未接触的新事物来说,我偏向于先看看他的外表,再一层一层扒掉它的外衣。

所以,这次,我们自顶向下的来看django rest framework是如何实现restful api的。

在django rest framework下提供restful api 总共分三步:

首先在viwe.py文件实现GoodsListViewSet如下:

from rest_framework import mixins
from rest_framework import viewsetsclass GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):queryset = Goods.objects.all()    # 获取待返回数据的querysetserializer_class = GoodsSerializer # 指定序列化器

接着,在serilaizers.py文件中实现GoodsSerializer如下:

from rest_framework import serializers
from goods.models import Goodsclass GoodsSerializer(serializers.ModelSerializer):    class Meta:model = Goods   fields = '__all__'

最后,在url.py文件中配置路由信息如下:

from rest_framework.documentation import include_docs_urls
from rest_framework.routers import DefaultRouterrouter = DefaultRouter()
router.register(r'goods', GoodsListViewSet, base_name="goods")urlpatterns = [url(r'^', include(router.urls))
]

好了。

现在已经可以通过浏览器中输入域名/goods 来获取goods的所有数据了,以json格式展现。

django rest framework还为我们处理了json数据,以便更好的展示

然后呢?只是这样吗?

到底强大在哪里呢?

我也不知道,我觉得吧,这得结合具体的业务才能评判。

所以今天,我们来看下django rest framework到底是怎么实现restful api的

难道你们不好奇吗。

还得从mixins.ListModelMixin和viewsets.GenericViewSet讲起

通过各种类的层层继承,django rest framework为我们做了很多事。

导致我们只需要继承相应的类以及适当的重载某些特性,即可实现所需的功能

我们看到,在view.py文件中,GoodsListViewSet类本身并没有指定任何方法来响应http请求

但是他继承了两个类。

我们先进入viewsets.GenericViewSet的定义看看:

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):"""The GenericViewSet class does not provide any actions by default,but does include the base set of generic view behavior, such asthe `get_object` and `get_queryset` methods."""pass

啥也没有,只是继承了另外两个类............

于是我们再来看下ViewSetMixin的定义:

class ViewSetMixin(object):"""This is the magic.Overrides `.as_view()` so that it takes an `actions` keyword that performsthe binding of HTTP methods to actions on the Resource.For example, to create a concrete view binding the 'GET' and 'POST' methodsto the 'list' and 'create' actions...view = MyViewSet.as_view({'get': 'list', 'post': 'create'})"""............

代码有很多,我一行也没考,但是从这个说明中以及可以看出一些东西了,下面,我用我CET6的水平为大家翻译一下。

这是一个魔法(这么自恋?!)。

我们重写了as_view(),实现了http请求到对资源的各种操作的绑定。

举个栗子,我们将http的get,post请求分别绑定到了list,creat上去......

emmmmm,貌似有点明白了.......

但是list,creat方法又是在哪里实现的呢?

没错,正是mixins.ListModelMixin

class ListModelMixin(object):"""List a queryset."""def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(page, many=True)return self.get_paginated_response(serializer.data)serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)

mixins.ListModelMixin实现了list操作,那么creat呢?

没错,是mixins.CreateModelMixin,实际上mixins.xxxxModelMixin共有5个,分别对应了不同的操作,需要时只要在类定义中继承即可。

至此,逻辑已经很清楚了。

我再来看看那个不起眼的generics.GenericAPIView到底干了啥:

class GenericAPIView(views.APIView):"""Base class for all other generic views."""# You'll need to either set these attributes,# or override `get_queryset()`/`get_serializer_class()`.# If you are overriding a view method, it is important that you call# `get_queryset()` instead of accessing the `queryset` property directly,# as `queryset` will get evaluated only once, and those results are cached# for all subsequent requests.queryset = Noneserializer_class = None

同样,我们只看说明。

他让我们重置queryset 和serializer_class这两个attributes,或者重载get_queryset()和get_serializer_class()这两个方法

从名字中看的出来,是和序列化相关的。

所以我们明白了,GoodsListViewSet继承了两个类,一个指定了http请求的响应方法,一个指定了数据的序列化方法。

我们来看个结构图:

完美~


转载于:https://www.cnblogs.com/jiage666/p/9599683.html

django rest framework------得心应手相关推荐

  1. 谈谈Django REST Framework(DRF)中的序列化器

    摘要 Django REST Framework(DRF)是一个强大的工具,可以帮助我们构建和处理RESTful API.其中的序列化器(Serializers)是其核心组件之一,它允许我们快速有效地 ...

  2. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  3. Django REST framework 简介

    1.在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 2.在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删.改. ...

  4. Django REST framework API 指南(2):响应

    Django REST framework API 指南(1):请求 Django REST framework API 指南(2):响应 Django REST framework API 指南(3 ...

  5. Django REST framework API 指南(12):验证器

    官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...

  6. Django REST framework的一些奇巧淫技(干货!!!)

    开始之前,假设你已经有Django和Django REST framework的一些基础了 mixins,ViewSet和routers配合使用 minxis的类有5种 CreateModelMixi ...

  7. Django REST framework快速入门

    1)简介: 接口使用REST framework,REST framework是一套基于Django 的 REST 框架,是一个强大灵活的构建 Web API 的工具包. 写接口三步完成:连接数据库. ...

  8. Django REST framework 1

    Django REST framework Django REST framework官方文档:点击  中文文档:点击 安装djangorestframework:pip3 install djang ...

  9. Django REST framework的各种技巧——1.基础讲解

    写在最上面的话 django是一个神奇的框架,而restframework又是遵循了这个框架的另一个神奇的框架,然而由于restframework的文档稀烂无比,很多时候你必须看源码才能写出科学的代码 ...

  10. 在django restful framework中设置django model的property

    众所周知,在django的model中,可以某些字段设置@property和setter deleter getter,这样就可以在存入数据的时候进行一些操作,具体原理请参见廖雪峰大神的博客https ...

最新文章

  1. BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
  2. 《移动平台开发》第3周学习总结
  3. C++(STL):19---deque之删除和emplace用法
  4. 在Linux上安装JDK9
  5. php给客户端发广播,phpsocket.io如何向一个组广播?
  6. 《Unix/linux编程实践教程》------重定向程序的I/O
  7. 运行hadoop指令之——WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform....
  8. android selector的item属性
  9. day39-Spring 14-Spring的JDBC模板:DBCP连接池配置
  10. VS2015sql本地服务器为空,详解VS2015自带LocalDB数据库用法实例
  11. 启用 Windows 功能 NetFx3 时出错,错误代码: -2146498529
  12. 深度学习C++代码配套教程(1. 总述)
  13. Openresty + GeoIP2实现IP归属国家查询
  14. 手把手教你用Python分析微信聊天内容
  15. 黄河流域公安院校网络空间安全技能挑战赛 QAQ 题解
  16. simple-uploader.js 文档
  17. Redis-PHP实战篇——常用的使用场景
  18. Layui-颜色选择器
  19. 2、igraph的简单实战
  20. 【转】如何实现点击textbox显示monthCalendar 选择monthCalendar把值传给textbox

热门文章

  1. Spring Boot 集成 Activiti
  2. Linux CentOS各大网站镜像资源地址展示,各种rpm资源包下载地址,rpm安装包大全
  3. 模拟电路技术之基础知识(三)
  4. CTFshow 命令执行 web56
  5. 【分组背包问题 (HDU 3535 )】
  6. 第四周实践项目2 算法库——单链表
  7. 计算机网络向用户提供的最重要的功能
  8. 判断电离层是否存在自由电子
  9. mysql 分时统计_mysql中数据统计的技巧备忘录
  10. JavaScript String