1.框架一(继承APIView)

  这里的第一部分使用骨架请参考我的博客(第三篇),它采用了restframework中最基础的办法(APIView)实现了相关请求,以下的框架都是基于它的

2.框架二(继承ViewSetMixin)

  对于框架一,我们只继承APIView,也能实现增删改查的方法,但是不要忘了:

  对于查看(get),我们可以查看全部,也能查看局部(添加id)

  对于删除,我们也要根据指定id删除,对于修改,我们也要根据指定id修改

  那么,我们就要写两个路由,两个类:一个类(CoursesView)中包含了get和post方法,每个方法不用携带id;一个类(CourseDetailView)中包含了get,put和delete三个方法,都需要携带id

  这样我们操作的的类过多,每一个都要写两套类,那样工作量就会很大

  而框架二是在继承APIView的基础下,再继承ViewSetMixin的类,来实现一套路由的管理

我们先来查看ViewSetMixin的文档说明:

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

 基于源码我们来重写views下的course.py

from rest_framework.views import APIView
from rest_framework.viewsets import ViewSetMixin class CoursesView(ViewSetMixin,APIView):
# 查看
def list(self, request, *args, **kwargs):
pass # 增加
def create(self, request, *args, **kwargs):
pass # 局部查看
def retrieve(self, request, pk, *args, **kwargs):
pass # 指定id修改
def update(self, request, pk, *args, **kwargs):
pass # 指定id删除
def destroy(self, request, pk, *args, **kwargs):
pass

  api下的urls.py

from django.conf.urls import url
from api.views import course urlpatterns = [
url(r'courses/$',course.CoursesView.as_view({'get':'list','post':'create'})),
url(r'courses/(?P<pk>\d+)/$',course.CoursesView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
]

  实际情况下,我们也不会这几种方法都用到,主要还是查看

3.框架三(继承ViewSetMixin和generics.GenericAPIView)

相关源码说明:

基于源码我们来重写views下的course.py

from api import models
from rest_framework.response import Response
from api.serializers.course import CourseSerializer
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin,CreateModelMixin,\
RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,ListModelMixin # 这里我只使用了list方法,你要是用其他哪一种方法,直接把它的相关类写进即可
class CoursesView(ListModelMixin,GenericViewSet):
queryset = models.Course.objects.all() def list(self, request, *args, **kwargs):
course_list = models.Course.objects.all()
ser = CourseSerializer(instance=course_list, many=True)
return Response(ser.data) 

  api下的urls.py

from django.conf.urls import url
from api.views import course urlpatterns = [
url(r'courses/$',course.CoursesView.as_view({'get':'list'})),
url(r'courses/(?P<pk>\d+)/$',course.CoursesView.as_view({'get':'retrieve'}))
]

 serializers下的course.py(也没有做改变)

from rest_framework import serializers

class CourseSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField()

 效果:

3.1基于框架三的扩展(可以使用序列化组件ModelSerializer,它继承了Serializer)

它的相关源码:

这里相关代码我就不演示了,可以查看之前的代码学习相关知识

 相关说明:对于框架一和框架二适用于用户请求处理时业务逻辑复杂的情况。 

     第三种框架,由于渲染器内部会调用视图对象的get_queryset方法,所以必须要设置queryset字段。

 针对第三种解决方案:

1. 设置queryset字段
class CoursesView(ListModelMixin,GenericViewSet):
queryset = models.Course.objects.all() def list(self, request, *args, **kwargs):
course_list = models.Course.objects.all()
ser = CourseSerializer(instance=course_list, many=True)
return Response(ser.data) 2. 不使用渲染器,没有那种好看的面板渲染了
class CoursesView(ListModelMixin,GenericViewSet):
renderer_classes = [JSONRenderer,] def list(self, request, *args, **kwargs):
course_list = models.Course.objects.all()
ser = CourseSerializer(instance=course_list, many=True)
return Response(ser.data)

  

Restframework中常见API的编写方式的更多相关文章

  1. css中常见几种float方式以及倒计时(刷新页面不清)

    css中常见几种float方式 http://jingyan.baidu.com/article/72ee561a670269e16138dfd5.html <script type=" ...

  2. .NET中常见的加解密方式

    在互联网普及的初期,人们更关注单纯的连接性,以不受任何限制地建立互联网为最终目的.正如事情都具有两面性,互联网的便捷性给人们带来了负面问题,计算机病毒的侵害.信息泄露.网络欺诈等利用互联网的犯罪行为日 ...

  3. 数据仓库系列之ETL中常见的增量抽取方式

    为了实现数据仓库中的更加高效的数据处理,今天和小黎子一起来探讨ETL系统中的增量抽取方式.增量抽取是数据仓库ETL(数据的抽取(extraction).转换(transformation)和装载(lo ...

  4. DOM中常见的元素获取方式

    1.getElementById获取元素    返回的是一个元素对象 var  timer = document.getElementById('time'); console.dir   打印返回元 ...

  5. VC中常见API函数使用方法(经验版)

    ***********************************************声明*************************************************** ...

  6. 关于shell中常见功能的实现方式总结

    一.shell脚本中连接数据库 二.

  7. html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结

    Day27  html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...

  8. JDBC简介及JDBC编写步骤及常见API

    JDBC : Java Database Connectivity,Java数据库连接.SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. JDBC就像一座桥 ...

  9. asp.net开发中常见公共捕获异常方式总结(附源码)

    本文实例总结了asp.net开发中常见公共捕获异常方式.分享给大家供大家参考,具体如下: 前言:在实际开发过程中,对于一个应用系统来说,应该有自己的一套成熟的异常处理框架,这样当异常发生时,也能得到统 ...

随机推荐

  1. springboot整合rabbitmq,支持消息确认机制

    安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...

  2. Python远程连接Windows,并调用Windows命令(类似于paramiko)

    import winrm win2012 = winrm.Session(')) r = win2012.run_cmd('D: &' ' cd python &' ' type s. ...

  3. AtCoder Grand Contest 023 C - Painting Machines

    Description 一个长度为 \(n\) 的序列,初始都为 \(0\),你需要求出一个长度为 \(n-1\) 的排列 \(P\), 按照 \(1\) 到 \(n\) 的顺序,每次把 \(P_i\ ...

  4. 【ubuntu】更换下载源

    ubuntu,我们在使用apt新装软件的时候,会使用官方的网站去下载软件,但是会因为国内的转接点太多,而导致下载的速度非常慢 ,我们可以通过换成一些中间的节点来进行下载,比如阿里源,中科大源,清华源等 ...

  5. windows下快速修改host文件

    windows下快速修改host文件 win+r  输入 notepad c:\Windows\System32\drivers\etc\hosts

  6. 03.if 和 switch结合练习

    namespace _04.练习01 { class Program { static void Main(string[] args) { //请用户输入年份,再输入月份,输出该月有多少天 Cons ...

  7. 提取url中参数的方法(转换成json格式)

    还是直接上代码吧. //将url中的参数获取到并抓换成json格式 function serilizeUrl(url){ var urlObject={}; //1.正则匹配是不是以?结尾 if(/\ ...

  8. 网易回合制游戏录像批量下载(失效 不是因为代码 是因为网易官方关闭了录像网站 :P)

    最近在访问网易大话西游2的录像专区时,发现页面还是很早之前的板式,网易的编辑并没有打算重新美化的打算,不由得内心一寒,结合之前好几个回合制游戏的倒闭,让很多人回顾都没办法回顾, 而且,很多人现在也没有 ...

  9. git 无法忽略Android Studio 生成的 .idea目录解决办法

    在Android Studio中导入了别的人Gradle项目,产生了 .idea文件夹, 然后git 发现了这个变动,修改了 .gitignore不起作用,仍然不能忽略这个文件夹 在项目目录里面 右键 ...

  10. greenplum维护

    1.用户管理 psql -d sea CREATE DATABASE BI; CREATE USER ubi WITH PASSWORD 'pwdbi' NOSUPERUSER; GRANT ALL ...