Rewriting our API using class-based views

使用类视图重写root views,只需要一点点重构。

from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status from .models import Course
from .serializer import CourseSerializer class CourseList(APIView):
'''
list all courses,or create a new course
'''
def get(self,request,format=None):
queryset = Course.objects.all()
serializer = CourseSerializer(queryset,many=True)
return Response(serializer.data) def post(self,request,format=None):
serializer = CourseSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.data,status=status.HTTP_400_BAD_REQUEST) class CourseDetail(APIView):
'''
retrieve,update or delete a course isntance
'''
def get_object(self,pk):
try:
return Course.objects.get(pk=pk)
except Course.DoesNotExist:
raise Http404 def get(self,request,pk,format=None):
course = self.get_object(pk)
serializer = CourseSerializer(course)
return Response(serializer.data) def put(self, request, pk, format=None):
course = self.get_object(pk)
serializer = CourseSerializer(course, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def delete(self, request, pk, format=None):
course = self.get_object(pk)
course.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

  

urlpatterns = [
path('admin/', xadmin.site.urls),
path('course/', views.CourseList.as_view(),name='course_list'),
path('course/<int:pk>/', views.CourseDetail.as_view() ,name='course_detail'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
#使用类视图的url方法as_view()

  

Using mixins

使用类视图最大的好处就是可以行为重用

from rest_framework import mixins
from rest_framework import generics from .models import Course
from .serializer import CourseSerializer class CourseList(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = Course.objects.all()
serializer_class = CourseSerializer def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
#使用GenericAPIView建立view,提供核心功能。
#加入ListModelMixin和CreateModelMixin,提供.list()和.create()动作。
#然后把get和post方法绑定到相关动作上。 class CourseDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Course.objects.all()
serializer_class = CourseSerializer def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs
#再次使用GenericAPIView提供核心功能,然后提供.retrieve(), .update() and .destroy() actions.

  

Using generic class-based views

使用mixin类可以减少代码,但rest框架提供了一组已经mixin-in的通用视图,可以再次减少代码。

from rest_framework import generics

from .models import Course
from .serializer import CourseSerializer class CourseList(generics.ListCreateAPIView):
queryset = Course.objects.all()
serializer_class = CourseSerializer class CourseDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Course.objects.all()
serializer_class = CourseSerializer

  

DRF教程3-类视图的更多相关文章

  1. Part 4:表单和类视图--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  2. Django RestFramework(DRF)类视图

    基础视图 1.基础函数视图(@api_view) DRF提供了一种函数基础视图来装饰Django的普通视图,我们可以使用request来接受请求和response响应.一个小例子: from rest ...

  3. 0014 基于DRF框架开发(02 基类视图 GenericAPIView)

    前端于对数据操作的请求基本上就分为四类:增删改查,即增加.删除.修改.查询. 而DRF把前端请求分为两个大类:带ID参数请求和不带ID参数请求. 不带ID参数请求包括:增加.分布多条查询 带ID参数请 ...

  4. DRF类视图让你的代码DRY起来

    刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don't Repeat Yourself)设计原则: 使 ...

  5. Django框架的使用教程--类视图-中间间-模板[六]

    类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, reques ...

  6. iOS10 UI教程基改变视图的外观与视图的可见性

    iOS10 UI教程基改变视图的外观与视图的可见性 视图是应用程序的界面,是用户在屏幕上看到的对象.用户可以通过触摸视图上的对象与应用程序进行交互,所以视图界面的优劣会直接影响到了客户体验的好坏.和视 ...

  7. ASP.NET MVC 5 学习教程:添加视图

    原文 ASP.NET MVC 5 学习教程:添加视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...

  8. Django 类视图

    引文 所有的类视图都继承django.views.generic.base.View类. 在URLconf中简单的使用通用视图 如果只是简单的做一些属性修改,可以使用as_view()方法,如下所示: ...

  9. Xamarin iOS教程之自定义视图

    Xamarin iOS教程之自定义视图 Xamarin iOS自定义视图 工具栏中的视图在实际应用开发中用的很多,但是为了吸引用户的眼球,开发者可以做出一些自定义的视图. [示例2-33]以下将实现一 ...

随机推荐

  1. nginx启动不了

    nginx简介 Nginx是一个高性能的HTTP和反向代理服务器. 支持的操作系统众多,windows.linux. MacOS X: 可实现负载均衡: Rewrite功能强大: 电商架构大部分都采用 ...

  2. Android-Universal-Image-Loader使用介绍

    简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...

  3. Python:元组

    元组:只读,不能修改,使用小括号 创建元组: tup1 = ('physics', 'chemistry', 1997, 2000) tup2 = (1, 2, 3, 4, 5 ) tup3 = &q ...

  4. H3C-L2TP

    l2tp enable #启用l2tp domain system authentication ppp local # 本地认证 access-limit disable state active ...

  5. 洛谷 1312 Mayan游戏——暴搜+剪枝

    题目:https://www.luogu.org/problemnew/show/P1312 自己写了很久.又T又WA的. 发现对题理解有误.改完后应该只有T了,但还是T的. 自己写了许多剪枝,很鸡肋 ...

  6. 配置tomcat https的步骤

    keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500 keytool -g ...

  7. 华为codecraft2018总结

    华为codecraft2018总结 想来也是参加了第二次了,自己还是那么的菜.总结下今年的比赛,得奖是不存在的了,但是收获还是有的. 代码相关的都在这里了:https://github.com/hui ...

  8. 网页元素定位Position

     第九章: 网页元素定位Position position属性 static:默认值,没有定位 relative:相对定位 absolute:绝对定位 fixed:固定定位  (一般不用) stati ...

  9. Httpclient: 多层翻页网络爬虫实战(以搜房网为例)

    参考:http://blog.csdn.net/qy20115549/article/details/52912532 一.创建数据表 #创建表:用来存储url地址信息 create table so ...

  10. TypeScript完全解读(26课时)_10.TypeScript完全解读-枚举

    10.TypeScript完全解读-枚举 新建enum.ts并在jindex.ts中引用 一个简单的数字枚举 可以通过两种方式获取枚举的值 获取到编码,第一个默认为0,后面的一次递增 第二种形式 可以 ...