Django-drf框架之GenericAPIView

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

GenericAPIView

GenericAPIView是什么

GenericAPIView继承自 APIVIew,增加了对于列表视图详情视图可能用到的通用支持方法**,通常使用时,可搭配一个或多个Mixin扩展类,来实现其他更加高级的功能,总结来说 GenericAPIView 是有关数据管理的基类,未来还会学习有关方法操作的基类

先来耍耍 GenericAPIView

from rest_framework.generics import GenericAPIView

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wEADpY5g-1637911904802)(assets/image.png)]

GenericAPIView内部属性

这个基类内置的了如下一些属性,其中一些是专门为列表视图进行返回的,一些是详情视图使用,还有一些列表与详情通用的,这些属性可以帮助我们进行序列化及反序列化的操作

列表、详情视图通用属性

  • queryset***=objects.all/.filter***/***.order_by***
    • 列表视图要操作的查询结果对象
  • serializer_class=Serializer
    • 视图中会使用到的序列化器,一般都是针对于上一个***queryset***所指定的

列表视图单独属性

  • pagination_class
    • 分页控制类,进行分页设置
  • filter_backends
    • 过滤控制后端,可以对数据进行字段过滤

详情页视图单独属性

  • lookup_url_kwarg
    • 动态路由传递的参数命名
  • lookup_field
    • 过滤的***orm***参数

列表与详情视图通用方法

  • get_queryset(self)
    • 返回视图使用的查询集,是列表视图与详情视图获取数据的基础
    • 默认返回***queryset***属性,支持重写
  • get_serializer_class(self)
    • 返回序列化器类,默认返回***serializer_class***,可以重写
  • get_serializer(self, args, **kwargs)
    • 返回序列化器对象

详情页视图单独方法

  • get_object(self)
    • 返回详情视图所需的模型类数据对象,默认使用***lookup_field**参数来过滤queryset***。 在试图中可以调用该方法获取详情信息的模型类对象
    • 若详情访问的模型类对象不存在,会返回404,如果访问到多个重复,也会报错,默认使用get方法进行orm查询
    • 该方法会默认使用 APIView 提供的***check_object_permissions***方法检查当前对象是否有权限被访问

  • 获取全部数据
class List(GenericAPIView):
    serializer_class = Ser
    queryset = User.objects.all()
    def get(self, request):
        data = self.get_queryset()
        ser = self.get_serializer(instance=data, many=True)
        return Response(ser.data)

  • 获取单个数据
class Detail(GenericAPIView):
    serializer_class = Ser
    queryset = User.objects.all()
    lookup_url_kwarg = 'id'  # 路由命名的参数
    lookup_field = 'pk'  # 过滤的orm参数
    def get(self, request, id):
        object = self.get_object()
        ser = self.get_serializer(instance=object)
        return Response(ser.data)
  • 动态路由的定义
path('detail//', Detail.as_view()), 
# 动态路由的id对应 lookup_url_kwarg
  • 访问时的 URL
http://127.0.0.1:8000/detail/1/

混入类与扩展类

混入类的功能划分

GenericAPIView只是提供了数据,对应的访问功能是没有实现的,所以DRF还有五个提供方法的混入类,可以完成基本增删改查功能,我们也叫Mixin 混入类**,通过GenericAPIView与混入类的多继承,可以实现更加复杂的接口功能,GenericAPIView提供数据,而混入类提供操作

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

混入类与GenericAPIView的组合使用

ListModelMixin

class ListView(ListModelMixin, GenericAPIView):
    queryset = Model.objects.all()
    serializer_class = Ser
    def get(self, request):
        return self.list(request)

CreateModelMixin

class CreateSer(serializers.ModelSerializer):
    class Meta:
        model = model
        fields = '__all__'
        
class CreateView(GenericAPIView, CreateModelMixin):
    serializer_class = CreateSer
    def post(self, request):
        return self.create(request)

RetrieveModelMixin

以***lookup_field***为 orm 过滤字段,查询***lookup_url_kwarg***对应值的一条数据详情,需要提供***queryset***参数作为查询的位置

class DetailView(GenericAPIView, RetrieveModelMixin):
    queryset = model.objects.all()
    serializer_class = DetailSer
    lookup_field = 'pk'
    lookup_url_kwarg = 'pk'
    def get(self, request, pk):
        return self.retrieve(request)
  • 设置的路由及访问的路由如下所示
path('detailview//', DetailView.as_view()),
# http://127.0.0.1:8000/detailview/1/

UpdateModelMixin

实现更新的话也需要***lookup_field***和***lookup_url_kwarg***来确定被更新数据,使用 put/post 等方式提交数据即可,对比创建的混合类

class UpdateView(GenericAPIView, UpdateModelMixin):
    queryset = model.objects.all()
    serializer_class = UpdateSer
    lookup_field = 'pk'  # 被更新数据过滤字段
    lookup_url_kwarg = 'pk'  # 被更新数据过滤条件参数值
    def put(self, request, pk):
        return self.update(request)

请求该视图时,不光需要链接传参数,还需要在请求体中提供更新后的数据

# put 
http://127.0.0.1:8000/updateview/1/
{
     
    "name":...
    "age": ...
}

注意:如果需要对序列化器字段进行局部更新,而不是所有数据都会更新,那么可以在update参数位置传递**partial参数,传递为True

self.update(request,partial=True)

DestroyModelMixin

比如删除一个已存在数据,和更新一样,需要有数据的过滤条件,不传就是用固定那套 pk 的机制查询

class DeleteView(GenericAPIView, DestroyModelMixin):
    queryset = model.objects.all()
    def delete(self, request, pk):
        return self.destroy(request)

扩展类的应用

CreateAPIView

  • 提供post方法,可以创建一条数据

继承自:GenericAPIViewCreateModelMixin

class TeacherCreateView(CreateAPIView):
    serializer_class = TeacherCreateSer

ListAPIView

  • 提供get方法,可以获取多条数据

继承自:GenericAPIViewListModelMixin

class TeacherListView(ListAPIView):
    queryset = Teacher.objects.all()  # 你要序列化的哪些数据结果
    serializer_class = TeacherListSer  # 用什么序列化器

RetireveAPIView

  • 提供get方法,获取某个具体数据的详情

继承自:GenericAPIViewRetrieveModelMixin

class TeacherDetailView(RetrieveAPIView):
    lookup_field = 'pk'  # 数据库里的字段
    lookup_url_kwarg = 'id'  # 过滤字段的条件,从路由传参数过来的
    queryset = Teacher.objects.all()
    serializer_class = TeacherDetailSer

DestoryAPIView

提供 delete 方法,可以删除某条存在数据

继承自:GenericAPIViewDestoryModelMixin

class TeacherDestoryView(DestroyAPIView):
    lookup_field = 'pk'  # 数据库里的字段
    lookup_url_kwarg = 'id'  # 过滤字段的条件,从路由传参数过来的
    queryset = Teacher.objects.all()

UpdateAPIView

  • 提供 put 和 patch 方法,可以更新或者局部更新某条数据

继承自:GenericAPIViewUpdateModelMixin

class TeacherUpdateView(UpdateAPIView):
    lookup_field = 'pk'  # 数据库里的字段
    lookup_url_kwarg = 'id'  # 过滤字段的条件,从路由传参数过来的
    queryset = Teacher.objects.all()
    serializer_class = TeacherUpdateSer

ListCreateAPIView

  • 提供 post 和 get 方法,可以创建一条数据,或获取列表数据

继承自:GenericAPIViewCreateModelMixinListModelMixin

class TeacherListCreateView(ListCreateAPIView):
    queryset = Teacher.objects.all()
    serializer_class = TeacherListCreateSer 
    # 共用一个序列化器同时实现创建和数据展示

RetrieveUpdateAPIView

  • 提供 get、put、patch 方法,可以获取一条数据详情,也可以更新一条数据

继承自:GenericAPIViewRetrieveModelMixinUpdateModelMixin

class TeacherRetrieveUpdateView(RetrieveUpdateAPIView):
    lookup_field = 'pk'  # 数据库里的字段
    lookup_url_kwarg = 'id'  # 过滤字段的条件,从路由传参数过来的
    queryset = Teacher.objects.all()
    serializer_class = TeacherRetrieveUpdateSer

RetrieveDestroyAPIView

  • 提供 get 和 delete 方法,可以获取和删除一条已存在数据

继承自:GenericAPIViewRetrieveModelMixinDestoryModelMixin

class TeacherRetrieveDestroyView(RetrieveDestroyAPIView):
    lookup_field = 'pk'  # 数据库里的字段
    lookup_url_kwarg = 'id'  # 过滤字段的条件,从路由传参数过来的
    queryset = Teacher.objects.all()
    serializer_class = TeacherDeatilSer 

RetrieveUpdateDestoryAPIView

  • 提供 get、put、patch、delete 方法,啥也能干

继承自:GenericAPIViewRetrieveModelMixinUpdateModelMixinDestoryModelMixin

class TeacherAll(RetrieveUpdateDestroyAPIView):
    lookup_field = 'pk'  # 数据库里的字段
    lookup_url_kwarg = 'id'  # 过滤字段的条件,从路由传参数过来的
    queryset = Teacher.objects.all()
    serializer_class = TeacherRetrieveUpdateSer

你可能感兴趣的:(Python学习,Drf,Django,django,python,后端)