DRF视图组件
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 # 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
DRF视图组件的更多相关文章
- DRF 视图组件
目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...
- drf视图组件、认证组件
视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...
- DRF 视图组件,路由组件
视图组件 -- 第一次封装 -- GenericAPIView(APIView): queryset = None serializer_class = None def ge ...
- DRF 视图组件代码
序列化器代码 # 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book class Publis ...
- DRF之视图组件
不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段. 使用serializer进行put接口设计 根据规范,PUT接口用来定义用户对数据修改的逻辑,也就是upd ...
- 【DRF框架】视图组件
基于mixins视图类 from rest_framework import mixins # 创建视图 class CreateModelMixin(object) def create(self, ...
- DRF的视图组件
目录 DRF的视图组件 两大视图类 六大视图工具类 九大工具视图类 两大视图集基类 DRF的视图组件 DRF的视图组件大概分以下几类 两大视图类 APIView.GenericAPIView from ...
- DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件
一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...
- DRF Django REST framework 之 视图组件(四)
引言 在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方.这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑. 视图组件 ...
随机推荐
- Scala的Higher-Kinded类型
Scala的Higher-Kinded类型 Higher-Kinded从字面意思上看是更高级的分类,也就是更高一级的抽象.我们先看个例子. 如果我们要在scala中实现一个对Seq[Int]的sum方 ...
- JDK14的新特性
文章目录 虽然JDK13在今年的9月17号才发布,但是丝毫不会影响到下一个版本JDK14的开发工作.听说官方定的新功能马上就要官宣了,我们这里不妨来提前推断一下. 在9月17号的发布中,Oracle提 ...
- c语言解一元二次方程
C语言解一元二次方程,输入系数a,b,c; #include <stdio.h> #include <math.h> int main(int argc, char *argv ...
- 自建Git服务器 - 创建属于你自己的代码仓库
最近有线上朋友私信问我怎么搭建个人博客,也有咨询我个人项目的代码是如何保管的,还有一个朋友问我买了服务器玩了一段时间,等新鲜感过了就不知道做什么了. 关于这些问题并没有一个标准答案,每个人都有自己的使 ...
- web前端项目中遇到的一些问题总结(08.23更新)
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 写一些最近工作中Vue项目中遇到的问题. 巴啦啦小魔仙,污卡拉,全身变,小 ...
- bootstrap-分页-默认分页
说明 默认分页 示例 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta c ...
- MySQL权限原理及删除MySQL的匿名账户
MySQL权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证,不合法的用户拒绝连接: (2)对通过认证的合法用户赋予相应的权限,用户可 ...
- 信息竞赛进阶指南--区间最值问题的ST算法
void ST_prework() { for (int i = 1; i <= n; i++) f[i][0] = a[i]; int t = log(n) / log(2) + 1; for ...
- USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位 ...
- Java——HTTP超详细总结
HTTP协议概述 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的 ...