DRF视图组件:  

CVB模式继承----五层
from django.views import View # Django的View
from rest_framework.views import APIView # drf的APIView继承View
from rest_framework.generics import GenericAPIView, CreateAPIView # drf的GenericAPIView继承APIView
# 以下CBV需要在路由的as_view()中添加对应参数---请求方式和函数的映射:无参数{'get':'list','post':'create'},带参数{'get':'retrive'}
from rest_framework.viewsets import GenericViewSet # drf的GenericViewSet继承ViewSetMixin和GenericAPIView,路由改变:需指定请求方法--视图函数映射
from rest_framework.viewsets import ModelViewSet # drf的ModelViewSet继承查(多条)、增、查(单条)、删、改和GenericViewSet,共有一个视图即可,路由有改变:需指定请求方法--视图函数(默认继承类处理)映射 一般多用APIView,对于基本的增删改查可直接使用ModelViewSet

models.py  

class UserGroup(models.Model):
title = models.CharField(max_length=10)

models.py:

urls.py

drf主路由配置urls.py  

from django.conf.urls import url,include
urlpatterns = [
url(r'^api/', include('api.urls')),
]

drf主路由配置urls.py:

api主路由配置urls.py:

from django.conf.urls import url
from api import views urlpatterns = [ # 继承APIView的路由写法
url(r'^(?P<version>v[\d+])/groups1/$', views.UserGroupView1.as_view(), ),
url(r'^(?P<version>v[\d+])/group1/(?P<pk>\d+)/$', views.UserGroupView11.as_view(), ), #继承GenericAPIView的路由写法
url(r'^(?P<version>v[\d+])/groups2/$', views.UserGroupView2.as_view(), ),
url(r'^(?P<version>v[\d+])/group2/(?P<pk>\d+)/$', views.UserGroupView22.as_view(), ), # 继承GenericViewSet的路由
url(r'^(?P<version>v[\d+])/groups3/$', views.UserGroupView3.as_view({'get':'list','post':'create'}), ),
url(r'^(?P<version>v[\d+])/group3/(?P<pk>\d+)/$', views.UserGroupView33.as_view({'get':'retrieve','put':'update','delete':'destroy'}), ),# 默认就是pk,或者自定义但需要指定但要在类中定义lookup_url_kwarg # 继承ModelViewSet的路由(执行同一个视图即可,有视图继承的不同类分别进行处理)
url(r'^(?P<version>v[\d+])/groups4/$', views.UserGroupView4.as_view({'get': 'list', 'post': 'create'}), ),
url(r'^(?P<version>v[\d+])/group4/(?P<pk>\d+)/$',
views.UserGroupView4.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}), ),
# 默认就是pk,或者自定义但需要指定但要在类中定义lookup_url_kwarg ]

api主路由配置urls.py:

views.py  

from django.shortcuts import render, HttpResponse
from rest_framework import serializers
from api import models
from rest_framework.response import Response#DRF自带,可自动进行序列化 #序列化器
class UserGroupSerializer1(serializers.ModelSerializer):
class Meta:
model = models.UserGroup
fields = "__all__" #1.继承APIView的CBV写法
from rest_framework.views import APIView
class UserGroupView1(APIView):
def get(self, request, *args, **kwargs):
groups = models.UserGroup.objects.all()
ser_groups = UserGroupSerializer1(instance=groups, many=True)
ret = ser_groups.data
return Response(ret) def post(self, request, *args, **kwargs):
ser_data = UserGroupSerializer1(data=request.data)
if ser_data.is_valid(): # 序列化器校验
ser_data.save() # 返回当前对象(序列化有instance就是更新)
else:
return Response(ser_data.errors)
return self.get(request, *args, **kwargs)
class UserGroupView11(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
group = models.UserGroup.objects.get(pk=pk)
ser_group = UserGroupSerializer1(instance=group) # many默认就是False
ret = ser_group.data
return Response(ret) def put(self, request, *args, **kwargs):
pk = kwargs.get('pk')
group = models.UserGroup.objects.get(pk=pk)
ser_data = UserGroupSerializer1(instance=group, data=request.data)
if ser_data.is_valid():
r = ser_data.save()
print(r)
else:
return Response(ser_data.errors)
return self.get(request, *args, **kwargs) def patch(self, request, *args, **kwargs):
pass def delete(self, request, *args, **kwargs):
pass #2.继承GenericAPIView的CBV写法(不实用--看源码)
from rest_framework.generics import GenericAPIView, CreateAPIView
class UserGroupView2(GenericAPIView):
# filter_backends#配置过滤字段
queryset = models.UserGroup.objects.all()
serializer_class = UserGroupSerializer1#指定序列化器
pagination_class = PageNumberPagination#自定分页类 def get(self, request, *args, **kwargs):
groups = self.get_queryset()
page_groups = self.paginate_queryset(groups)
ser_data = self.get_serializer(instance=page_groups, many=True)
ret =ser_data.data
return Response(ret)
def post(self,request,*args,**kwargs):
ser_data = UserGroupSerializer1(data=request.data)
if ser_data.is_valid(): # 序列化器校验
ser_data.save() # 返回当前对象(序列化有instance就是更新)
else:
return Response(ser_data.errors)
return self.get(request, *args, **kwargs) class UserGroupView22(GenericAPIView):
# filter_backends#配置过滤字段
queryset = models.UserGroup.objects.all()
serializer_class = UserGroupSerializer1
lookup_field = 'pk'#指定字段(默认)--获取单个对象用 def get(self, request, *args, **kwargs):
obj = self.get_object()
ser_data = self.get_serializer(instance=obj,many=False)
ret = ser_data.data
return Response(ret) def put(self, request, *args, **kwargs):
pk = kwargs.get('pk')
pass def delete(self, request, *args, **kwargs):
pass #3.继承GenericViewSet的CBV写法(注意路由的改变--请求与函数映射,函数名可自定义或采用默认,但必须对应)
from rest_framework.viewsets import GenericViewSet
class UserGroupView3(GenericViewSet):
queryset = models.UserGroup.objects.all()
serializer_class = UserGroupSerializer1
pagination_class = PageNumberPagination
def list(self, request, *args, **kwargs):
groups = self.get_queryset()
page_groups = self.paginate_queryset(groups)
ser_data = self.get_serializer(instance=page_groups, many=True)
ret =ser_data.data
return Response(ret)
def create(self,request,*args,**kwargs):
ser_data = UserGroupSerializer1(data=request.data)
if ser_data.is_valid(): # 序列化器校验
ser_data.save() # 返回当前对象(序列化有instance就是更新)
else:
return Response(ser_data.errors)
return Response('post--create--ok!') class UserGroupView33(GenericViewSet):
queryset = models.UserGroup.objects.all()
serializer_class = UserGroupSerializer1
lookup_field = 'pk'#指定字段(默认)--获取单个对象用 def retrieve(self, request, *args, **kwargs):
obj = self.get_object()
ser_data = self.get_serializer(instance=obj, many=False)
ret = ser_data.data
return Response(ret) def update(self, request, *args, **kwargs):
obj = self.get_object()#获取当前对象通过指定字段lookup_field
ser_data = self.get_serializer(instance=obj,data=request.data, many=False)
if ser_data.is_valid():
ser_data.save()
else:
return Response(ser_data.errors)
return HttpResponse('put--update--ok!') def destroy(self, request, *args, **kwargs):
models.UserGroup.objects.get(pk=self.lookup_field).delete()
return HttpResponse('delete--destroy--ok!') #4.继承ModelViewSet(继承6个类)的CBV写法(注意路由的改变--请求与函数(采用默认的类自己处理)映射)#针对简单的增删改查适用
from rest_framework.viewsets import ModelViewSet
class UserGroupView4(ModelViewSet):
queryset = models.UserGroup.objects.all()
serializer_class = UserGroupSerializer1
pagination_class = PageNumberPagination
lookup_field = 'pk' # 指定字段(默认)--获取单个对象用(改/删/查单个)注意与url中对应

views.py:

settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api.apps.ApiConfig',
'rest_framework',
] REST_FRAMEWORK = {
# 版本组件
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', # 设置版本组件类
'DEFAULT_VERSION': 'v1', # 默认的API版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的API版本
'VERSION_PARAM': 'version', # 版本的key,默认的就是version(注意要和api接口中的key对应) # 解析器组件
'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', ],
# 可指定多个解析器,不配置默认支持所有 # 分页组件
'PAGE_SIZE': 3 }

settings.py

CVB模式继承----五层

from django.views import View  # DjangoView

from rest_framework.views
import APIView 
# drfAPIView继承View

from rest_framework.generics
import GenericAPIView, CreateAPIView  # drfGenericAPIView继承APIView

# 以下CBV需要在路由的as_view()中添加对应参数---请求方式和函数的映射:无参数{'get':'list','post':'create'},带参数{'get':'retrive'}

from rest_framework.viewsets
import GenericViewSet  # drfGenericViewSet继承ViewSetMixinGenericAPIView,路由改变:需指定请求方法--视图函数映射

from rest_framework.viewsets
import ModelViewSet  # drfModelViewSet继承查(多条)、增、查(单条)、删、改和GenericViewSet,共有一个视图即可,路由有改变:需指定请求方法--视图函数(默认继承类处理)映射

一般多用APIView,对于基本的增删改查可直接使用ModelViewSet

DRF视图组件的更多相关文章

  1. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  2. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  3. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  4. DRF 视图组件代码

    序列化器代码 # 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book class Publis ...

  5. DRF之视图组件

    不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段. 使用serializer进行put接口设计 根据规范,PUT接口用来定义用户对数据修改的逻辑,也就是upd ...

  6. 【DRF框架】视图组件

    基于mixins视图类 from rest_framework import mixins # 创建视图 class CreateModelMixin(object) def create(self, ...

  7. DRF的视图组件

    目录 DRF的视图组件 两大视图类 六大视图工具类 九大工具视图类 两大视图集基类 DRF的视图组件 DRF的视图组件大概分以下几类 两大视图类 APIView.GenericAPIView from ...

  8. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  9. DRF Django REST framework 之 视图组件(四)

    引言 在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方.这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑. 视图组件 ...

随机推荐

  1. DZ的CURD

    Discuz二次开发-MySQL插入数据(insert) DB::insert($tableName,$data,$flag); $tableName:表名 $data:插入数据,以字段为键值的关联数 ...

  2. 替换字符串sql

    update [表名] set 字段名 = replace(与前面一样的字段名,'原本内容','想要替换成什么') UPDATE `zjl_III_hei_zlj_20151111`.`ctrl_ne ...

  3. Logon Trigger Example (C++)

    This C++ example shows how to create a task that is scheduled to execute Notepad when a user logs on ...

  4. Cannot find or open the PDB file

    打开VS:工具 --> 选项 --> 调试-->符号接下来就是选择Microsoft,然后确认

  5. Django Channel实时推送与聊天

    先来看一下最终的效果吧 开始聊天,输入消息并点击发送消息就可以开始聊天了 点击 “获取后端数据”开启实时推送 先来简单了解一下 Django Channel Channels是一个采用Django并将 ...

  6. java 中的fork join框架

    文章目录 ForkJoinPool ForkJoinWorkerThread ForkJoinTask 在ForkJoinPool中提交Task java 中的fork join框架 fork joi ...

  7. build.gradle 详解(一)

    简述: 1) Java 开发中有两个大名鼎鼎的项目构建 ANT.Maven. 2) Google 推荐使用的 Android studio 是采用 Gradle 来构建项目.Gradle 是一个非常先 ...

  8. javaScript常用到的方法

    判断一个对象是否为空对象,不为null,仅仅是{};可以使用如下方法判断: if (JSON.stringify(object) === '{}') { //.. } //也可以 if (Object ...

  9. TCP连接过程及报文解析

    可能大家都听过TCP建立连接时需要经历三次握手和四次挥手的. 那么具体的握手挥手的过程是怎么样的呢? 这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程. 实验方法: 写一段简单的代 ...

  10. JS的String()、toString()、valueOf()的一些隐秘特性

    toString()方法 要把一个值转换为一个字符串,最常用的就是,使用几乎每个值都有的toString()方法,这个方法唯一要做的就是返回相应值的字符串表现. 数值.布尔值.对象和字符串值(没错,每 ...