前言
这几年一直在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/<int:id>/', 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/<int:pk>/', 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方法,可以创建一条数据
继承自:GenericAPIView、CreateModelMixin
class TeacherCreateView(CreateAPIView):
serializer_class = TeacherCreateSer
ListAPIView
- 提供get方法,可以获取多条数据
继承自:GenericAPIView、ListModelMixin
class TeacherListView(ListAPIView):
queryset = Teacher.objects.all() # 你要序列化的哪些数据结果
serializer_class = TeacherListSer # 用什么序列化器
RetireveAPIView
- 提供get方法,获取某个具体数据的详情
继承自:GenericAPIView、RetrieveModelMixin
class TeacherDetailView(RetrieveAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherDetailSer
DestoryAPIView
提供 delete 方法,可以删除某条存在数据
继承自:GenericAPIView、DestoryModelMixin
class TeacherDestoryView(DestroyAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
UpdateAPIView
- 提供 put 和 patch 方法,可以更新或者局部更新某条数据
继承自:GenericAPIView、UpdateModelMixin
class TeacherUpdateView(UpdateAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherUpdateSer
ListCreateAPIView
- 提供 post 和 get 方法,可以创建一条数据,或获取列表数据
继承自:GenericAPIView、CreateModelMixin、ListModelMixin
class TeacherListCreateView(ListCreateAPIView):
queryset = Teacher.objects.all()
serializer_class = TeacherListCreateSer
# 共用一个序列化器同时实现创建和数据展示
RetrieveUpdateAPIView
- 提供 get、put、patch 方法,可以获取一条数据详情,也可以更新一条数据
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin
class TeacherRetrieveUpdateView(RetrieveUpdateAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherRetrieveUpdateSer
RetrieveDestroyAPIView
- 提供 get 和 delete 方法,可以获取和删除一条已存在数据
继承自:GenericAPIView、RetrieveModelMixin、DestoryModelMixin
class TeacherRetrieveDestroyView(RetrieveDestroyAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherDeatilSer
RetrieveUpdateDestoryAPIView
- 提供 get、put、patch、delete 方法,啥也能干
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
class TeacherAll(RetrieveUpdateDestroyAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherRetrieveUpdateSer