这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
一、简介
django rest framework 给我们带来了很多组件,除了认证、权限、序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使用者而言不同的视图具有不同的功能,这样我们可以根据需求定制自己视图。以下是官网传送门:www.django-rest-framework.org/api-guide/v…
在之前的文章中,由于参杂了权限、认证等(如果不了解请看博客的以前的文章),但在本章中基本可以不使用,所进使用以下简单模型进行说明:
settings中注册django rest framework
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
'rest_framework',
]
models.py
from django.db import models
# Create your models here.
class UserInfo(models.Model):
username = models.CharField(max_length=32,unique=True)
password = models.CharField(max_length=64)
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/v1/users', views.UerView.as_view()),
]
二、各类视图使用
1.APIView
该视图是最基本的视图,之前的章节中已经介绍如何使用
2.GenericAPIView
该视图为我们封装一些静态字段,用于调用其他组件,示例(解释请看注解):
from django.shortcuts import render
# Create your views here.
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework import serializers
from rest_framework import pagination
from app01 import models
class Userserializer(serializers.ModelSerializer): #序列化类定义,前面章节已经介绍
class Meta:
model = models.UserInfo
fields = '__all__' #序列化字段
class Mypagination(pagination.PageNumberPagination): # 分页类定义,前面章节也已经介绍
"""自定义分页"""
page_size=2 #默认每页显示个数配置
page_query_param = 'p' # 页面传参的key,默认是page
page_size_query_param='size' # 指定每页显示个数参数
max_page_size=4 # 每页最多显示个数配置,使用以上配置,可以支持每页可显示2~4条数据
class UerView(GenericAPIView): #视图
queryset = models.UserInfo.objects.all() #数据的queryset
serializer_class = Userserializer # 序列化类使用
permission_classes = [] # 权限认证,这里不做认证,前面章节也有介绍权限
pagination_class = Mypagination #分页类,前面章节也已经介绍
def get(self,*args,**kwargs):
roles=self.get_queryset() # 获取queryset,实际取queryset,也就是models.UserInfo.objects.all()
page_res=self.paginate_queryset(queryset=roles) #分页结果
res=self.get_serializer(instance=page_res,many=True) #序列化
return Response(res.data) #返回结果
访问http://127.0.0.1:8000/api/v1/users ,查看结果如下:
3.GenericViewSet
该视图类需要和路由配合使用,修改后的urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^api/v1/users', views.UserView.as_view()),
url(r'^api/v2/users', views.UserView.as_view({'get':'show','post':'create'})), #重写as_view方法,并对请求方法进行映射
]
views.py
from django.shortcuts import render
# Create your views here.
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework import serializers
from rest_framework import pagination
from rest_framework.viewsets import GenericViewSet
from app01 import models
class Userserializer(serializers.ModelSerializer): #序列化类定义,前面章节已经介绍
class Meta:
model = models.UserInfo
fields = '__all__' #序列化字段
class Mypagination(pagination.PageNumberPagination): # 分页类定义,前面章节也已经介绍
"""自定义分页"""
page_size=2 #默认每页显示个数配置
page_query_param = 'p' # 页面传参的key,默认是page
page_size_query_param='size' # 指定每页显示个数参数
max_page_size=4 # 每页最多显示个数配置,使用以上配置,可以支持每页可显示2~4条数据
class UserView(GenericViewSet): #视图
queryset = models.UserInfo.objects.all() #数据的queryset
serializer_class = Userserializer # 序列化类使用
permission_classes = [] # 权限认证,这里不做认证,前面章节也有介绍权限
pagination_class = Mypagination #分页类,前面章节也已经介绍
def show(self,*args,**kwargs): #与url中映射的方法名称相同
roles=self.get_queryset() # 获取queryset,实际取queryset,也就是models.UserInfo.objects.all()
page_res=self.paginate_queryset(queryset=roles) #分页结果
res=self.get_serializer(instance=page_res,many=True) #序列化
return Response(res.data) #返回结果
def create(self,*args,**kwargs):
pass
访问http://127.0.0.1:8000/api/v2/users ,结果和上面结果一样如图:
4.ModelViewSet
modelViewSet继承了mixins.CreateModelMixin、mixins.RetrieveModelMixin、mixins.UpdateModelMixin、mixins.DestroyModelMixin、mixins.ListModelMixin、GenericViewSet所以它有很父类的所有功能,而这些父类分别提供创建、获取、更新、删除等方法,所以我们不需要写增删该查,视图已经帮我实现了,示例:
此时路由urls.py
"""
resetful URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/v1/users$', views.UserView.as_view({'get':'list','post':'create'})),
#路由,retrieve、delete、create、update、partial_update,在UserView的父类全部实现,其中pk参数必须携带,想当于key,类可操作
url(r'^api/v1/users/(?P<pk>\d+)$', views.UserView.as_view({'get':'retrieve','delete':'destroy','post':'create','put':'update','patch':'partial_update'})),
]
视图views.py
from django.shortcuts import render
# Create your views here.
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
from rest_framework import serializers
from rest_framework import pagination
from rest_framework.viewsets import ModelViewSet
from app01 import models
class Userserializer(serializers.ModelSerializer): #序列化类定义,前面章节已经介绍
class Meta:
model = models.UserInfo
fields = '__all__' #序列化字段
class Mypagination(pagination.PageNumberPagination): # 分页类定义,前面章节也已经介绍
"""自定义分页"""
page_size=2 #默认每页显示个数配置
page_query_param = 'p' # 页面传参的key,默认是page
page_size_query_param='size' # 指定每页显示个数参数
max_page_size=4 # 每页最多显示个数配置,使用以上配置,可以支持每页可显示2~4条数据
class UserView(ModelViewSet): #视图
queryset = models.UserInfo.objects.all() #数据的queryset
serializer_class = Userserializer # 序列化类使用
permission_classes = [] # 权限认证,这里不做认证,前面章节也有介绍权限
pagination_class = Mypagination #分页类,前面章节也已经介绍
访问http://127.0.0.1:8000/api/v1/users/1 ,查看多增删改。