GenericAPIView的使用

from rest_framework.generics import GenericAPIView
GenericAPIView继承 APIView,主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展 因此也是需要进行序列化的三个步骤,但是是使用GenericAPIView的时候,必须要有一个前提,就是:必须申明当前视图类中操作的模型数据是
queryset = BookInfo.objects.all() # 必须申明当前视图类中操作的模型数据是什么,
也可以选择性的增加 serializer_class = BookInfoModelSerializer # 可以声明当前要调用的序列化器是什么

1、利用GenericAPIView获取所有 的数据

完整的例子: # views.py
# GeneriaAPIView的使用
from rest_framework.generics import GenericAPIView
from app01.serializers import BookInfoModelSerializer
from rest_framework.response import Response
class BookInfoGenericAPIView(GenericAPIView):
queryset = BookInfo.objects.all() # 必须申明当前视图类中操作的模型数据是什么
serializer_class = BookInfoModelSerializer # 可以声明当前要调用的序列化器是什么
def get(self,request): print("reqeust的数据是",request) # <rest_framework.request.Request object at 0x000000FA185102B0> 对象
# 第一步:操作数据 获取所有数据
data_list=self.get_queryset()
print("data_Lists数据是",data_list) # 从数据库中查询到的QuerySet 数据 列表
# 第二步 序列化
serializer=self.get_serializer(instance=data_list,many=True)
print("serializer的数据是>>",serializer)
# 第三步L:响应数据
return Response(serializer.data) # urls.py
from django.urls import path,re_path
from . import views urlpatterns=[
# as_view是继承的APIView
path("app03/",views.BookInfoGenericAPIView.as_view()),
]

2、利用GenericAPIView获取一条数据

view.py

# 利用GenericAPIView获取一条数据,需要传入当前查询的数据的pk值
from rest_framework.generics import GenericAPIView
from app01.serializers import BookInfoModelSerializer
from booktest.models import BookInfo
from rest_framework.response import Response
class BookInfo2GenericAPIView(GenericAPIView):
# GenericAPIView必须要要queryset 和 serilizer_class
queryset = BookInfo.objects.all() # 申明当前操作的模型数据是什么
serializer_class = BookInfoModelSerializer # 声明当前使用的序列化器什么 def get(self,request,pk):
print("执行没?")
# 三步骤:
# 第一步:操作数据,根据id获取一条数据[使用self.get_object的前提是路由中必须声明一个pk的路由参数,
# 如果没有这个参数,则报错]
book=self.get_object()
print("book〉〉",book) # book〉〉 图书:《射雕英雄传》
# 第二步:序列化
serializer=self.get_serializer(instance=book)
print("serializer>>",serializer) # s是一个serialzer的模型的显示
# 第三步:响应数据 return Response(serializer.data)

urls.py

from django.urls import path,re_path
from . import views urlpatterns=[
re_path("app03/(?P<pk>\d+)",views.BookInfo2GenericAPIView.as_view()), ]

ps:

ps:
01: serializer=self.get_serializer(instance=book)其中的参数说明
##### get_serializer(self, *args, \**kwargs) 返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。 **注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。** - **request** 当前视图的请求对象
- **view** 当前请求的类视图对象
- format 当前请求期望返回的数据格式 02:**get_object(self)**
返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。 在试图中可以调用该方法获取详情信息的模型类对象。 **若详情访问的模型类对象不存在,会返回404。** 该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。 举例:
# url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
class BookDetailView(GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer def get(self, request, pk):
book = self.get_object() # get_object()方法根据pk参数查找queryset中的数据对象
serializer = self.get_serializer(book)
return Response(serializer.data)

3、利用GenriacAPIView结合mixins的5个扩展视图类进行数据的增删改查询

'''
GericAPIView可以和视图扩展类进行结合,来快速简化视图方法的代码
提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,
则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。 mixins内的五个视图扩展类:
ListModelMixin列表视图扩展类,提供`list(request, *args, **kwargs)`方法快速实现列表视图,返回200状态码。
该Mixin的list方法会对数据进行过滤和分页。 CreateModelMixin :创建视图扩展类,提供`create(request, *args, **kwargs)`方法快速实现创建资源的视图,成功返回201状态码。
如果序列化器对前端发送的数据验证失败,返回400错误。 RetrieveModelMixin:详情视图扩展类,提供`retrieve(request, *args, **kwargs)`方法,可以快速实现返回一个存在的数据对象。
如果存在,返回200, 否则返回404。 UpdateModelMixin:更新视图扩展类,提供`update(request, *args, **kwargs)`方法,可以快速实现更新一个存在的数据对象。
同时也提供`partial_update(request, *args, **kwargs)`方法,可以实现局部更新。
成功返回200,序列化器校验数据失败时,返回400错误 DestroyModelMixin:删除视图扩展类,提供`destroy(request, *args, **kwargs)`方法,可以快速实现删除一个存在的数据对象。
成功返回204,不存在返回404。 '''

views.py

from rest_framework.generics import GenericAPIView
from booktest.models import BookInfo
from app01.serializers import BookInfoModelSerializer
from rest_framework import mixins '''
mixins 类中有5个视图函数,这个五个视图函数有不同的作用,但是基本是
对数据的增删改查视图
'''
class BookInfoMixinAPIView(GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):
# 必须要先声明 queryset和serializer_class
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer # 查询获取所有数据
def get(self, request):
return self.list(request) # 添加数据
def post(self,request): return self.create(request) # CreateModelMixin内部有创建函数 from rest_framework.generics import GenericAPIView
from rest_framework import mixins
from app01.serializers import BookInfoSerializer
from booktest.models import BookInfo
# 通过GericAPIView和mixins下的修改,删除,获取一条数据来编写简化版的视图函数
class BookInfo2MixinAPIView(GenericAPIView, mixins.RetrieveModelMixin,mixins.DestroyModelMixin,mixins.UpdateModelMixin):
# 必须要先声明 queryset和serializer_class
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer # 获取一条数据
def get(self,request,pk): return self.retrieve(request,pk) # 更新一条数据
def put(self, request, pk): return self.update(request,pk) # 删除一条数据
def delete(self,request,pk): return self.destroy(request,pk)

urls.py

from django.urls import path,re_path
from . import views urlpatterns=[
# re_path("app03/(?P<pk>\d+)/",views.BookInfo3APIView.as_view()),
path("app03/",views.BookInfoGenericAPIView.as_view()),
re_path("app03/(?P<pk>\d+)",views.BookInfo2GenericAPIView.as_view()),
path("book01/",views.BookInfoMixinAPIView.as_view()),
re_path("book02/(?P<pk>\d+)",views.BookInfo2MixinAPIView.as_view()), ]

GenericAPIView的使用及和视图扩展类的结合使用的更多相关文章

  1. DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集

    复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...

  2. DRF (Django REST framework) 中的视图扩展类

    2. 五个扩展类 1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法 ...

  3. Django视图扩展类

    Django视图扩展类 扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer 需要自定义get.post等请求方法,内部实现调用扩展类 ...

  4. [Django REST framework - 视图组件之视图基类、视图扩展类、视图子类、视图集]

    [Django REST framework - 视图组件之视图基类.视图扩展类.视图子类.视图集] 视图继承关系 详图见文章末尾 视图组件可点我查看 两个视图基类:APIView.GenericAP ...

  5. django-rest-framework框架 第三篇 之CRUD视图扩展类(增删改查的优化)

    CRUD视图扩展类 1 CreateModelMixin 2 RetrieveModelMixin 3 UpdateModelMixin 4 DestroyModelMixin <1> 创 ...

  6. DRF视图-5个扩展类以及GenericAPIView基类

    视图 5个视图扩展类 视图拓展类的作用: 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量. 这 ...

  7. DRF中五大扩展类及视图集的介绍

    五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对 ...

  8. 视图家族之mixins视图工具类与generics工具视图类

    视图家族之mixins视图工具类与generics工具视图类 一.mixins视图工具类 作用: 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通 ...

  9. day73:drf:drf视图相关类&路由Routers&创建虚拟环境

    目录 1.APIView 2.GenericAPIView:通用视图类 3.5个视图扩展类:ListModelMixin,CreateModelMixin,RetrieveModelMixin,Upd ...

随机推荐

  1. react找到对象数组中指定的值

    找到对象数组中指定的值var array = [            { label: "Custom", value: "0" },            ...

  2. vue 模拟去哪网

    模拟项目中遇到的问题,总结如下: 1.争对轮播图 使用vue-awesome-swiper npm install vue-awesome-swiper@2.6.7 --save //因为此版本稳定 ...

  3. LazyMan的深入解析和实现

    一.题目介绍 以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank!   L ...

  4. UEditor使用报错Cannot set property 'innerHTML' of undefined

    仿用UEditor的setContent的时候报错,报错代码如下Uncaught TypeError: Cannot set property ‘innerHTML’ of undefined.调试u ...

  5. 31. Next Permutation (JAVA)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  6. 内置json&pickle&shelve&xml

    序列化:把对象(变量)从内存中变成可存储可传输的过程称之为序列化,Python中叫做pickling,其他语言中也被称之为serialization,marshalling,flattening等等 ...

  7. PAT Advanced 1006 Sign In and Sign Out (25 分)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  8. Ansbile实战经验

    一.相关用法: 1.执行shell 获取web组里得eth0接口信息 ansible web -a "ifconfig eth0" 2.执行ifconfig eth0 命令,ans ...

  9. java集合类图详解

  10. python 删除/app/*/logs/*/*.logs指定多少天的文件

    # encoding: utf-8 import sys import getopt import os import glob import time import datetime def rem ...