这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
GenericAPIView继承自 APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法**,通常使用时,可搭配一个或多个Mixin扩展类,来实现其他更加高级的功能,总结来说 GenericAPIView 是有关数据管理的基类,未来还会学习有关方法操作的基类
先来耍耍 GenericAPIView
from rest_framework.generics import GenericAPIView
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wEADpY5g-1637911904802)(assets/image.png)]
这个基类内置的了如下一些属性,其中一些是专门为列表视图进行返回的,一些是详情视图使用,还有一些列表与详情通用的,这些属性可以帮助我们进行序列化及反序列化的操作
objects.all
/.filter
***/***.order_by
***
Serializer
**kwargs
)
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
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
class ListView(ListModelMixin, GenericAPIView):
queryset = Model.objects.all()
serializer_class = Ser
def get(self, request):
return self.list(request)
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)
以***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/
实现更新的话也需要***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)
比如删除一个已存在数据,和更新一样,需要有数据的过滤条件,不传就是用固定那套 pk 的机制查询
class DeleteView(GenericAPIView, DestroyModelMixin):
queryset = model.objects.all()
def delete(self, request, pk):
return self.destroy(request)
继承自:GenericAPIView、CreateModelMixin
class TeacherCreateView(CreateAPIView):
serializer_class = TeacherCreateSer
继承自:GenericAPIView、ListModelMixin
class TeacherListView(ListAPIView):
queryset = Teacher.objects.all() # 你要序列化的哪些数据结果
serializer_class = TeacherListSer # 用什么序列化器
继承自:GenericAPIView、RetrieveModelMixin
class TeacherDetailView(RetrieveAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherDetailSer
提供 delete 方法,可以删除某条存在数据
继承自:GenericAPIView、DestoryModelMixin
class TeacherDestoryView(DestroyAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
继承自:GenericAPIView、UpdateModelMixin
class TeacherUpdateView(UpdateAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherUpdateSer
继承自:GenericAPIView、CreateModelMixin、ListModelMixin
class TeacherListCreateView(ListCreateAPIView):
queryset = Teacher.objects.all()
serializer_class = TeacherListCreateSer
# 共用一个序列化器同时实现创建和数据展示
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin
class TeacherRetrieveUpdateView(RetrieveUpdateAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherRetrieveUpdateSer
继承自:GenericAPIView、RetrieveModelMixin、DestoryModelMixin
class TeacherRetrieveDestroyView(RetrieveDestroyAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherDeatilSer
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
class TeacherAll(RetrieveUpdateDestroyAPIView):
lookup_field = 'pk' # 数据库里的字段
lookup_url_kwarg = 'id' # 过滤字段的条件,从路由传参数过来的
queryset = Teacher.objects.all()
serializer_class = TeacherRetrieveUpdateSer