django 视图

294 阅读4分钟

这是我参与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 ,查看多增删改。