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. spring boot 枚举使用的坑

    java 枚举的功能挺多,但是坑更多,使用的时候要注意.如下面这个枚举. @Getter @AllArgsConstructor public enum EnumExpenseType impleme ...

  2. 42. Trapping Rain Water (JAVA)

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  3. jquery.lazyload (JS懒加载框架使用详解)

    /** 本地加载方式加载JS*/        NSString *path = [[NSBundle mainBundle] pathForResource:@"jquery.js&quo ...

  4. pypi源

    清华大学pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple豆瓣pip install requests -i https: ...

  5. CentOS7升级gcc

    CentOS7.5升级gcc到8.3.0版本 1.下载源码包 cd /usr/local/src wget http://ftp.tsukuba.wide.ad.jp/software/gcc/rel ...

  6. PAT Basic 1036 跟奥巴马一起编程 (15 分)

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014 年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个 ...

  7. 仿scikit-learn模式写的kNN算法

    一.什么是kNN算法 k邻近是指每个样本都可以用它最接近的k个邻居来代表. 核心思想:如果一个样本在特征空间中的k个最相邻的样本中大多数属于一个某类别,则该样本也属于这个类别. 二.将kNN封装成kN ...

  8. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  9. Manacher || P4555 [国家集训队]最长双回文串 || BZOJ 2565: 最长双回文串

    题面:P4555 [国家集训队]最长双回文串 题解:就.就考察马拉车的理解 在原始马拉车的基础上多维护个P[i].Q[i]数组,分别表示以i结尾最长回文子串的长度和以i开头的最长回文子串的长度 然后就 ...

  10. JavaSE---显式锁

    1.概述 1.1.jdk5之前,用于  调节共享对象访问机制  只有 synchronized.volatile:     jdk5之后,提供了  显示锁:Lock.ReentrantLock...: ...