Django视图扩展类知识点详解
扩展类必须配合GenericAPIView使用扩展类内部的方法,在调用序列化器时,都是使用get_serializer
需要自定义get、post等请求方法,内部实现调用扩展类对应方法即可。
一、mixins的视图子类
作用:
提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。
1.1ListModelMixin
列表视图扩展类,提供list(request,*args,**kwargs)方法快速实现列表视图,返回200状态码。
- 提供list方法,快速实现列表视图
- 调用GenericAPIView设置好的结果集
- 调用GenericAPIView设置好的序列化器
该Mixin的list()方法会对数据进行过滤和分页。
源代码:
fromrest_framework.mixinsimportListModelMixin classListModelMixin(object): """ Listaqueryset. """ deflist(self,request,*args,**kwargs): #过滤 queryset=self.filter_queryset(self.get_queryset()) #分页 page=self.paginate_queryset(queryset) ifpageisnotNone: serializer=self.get_serializer(page,many=True) returnself.get_paginated_response(serializer.data) #序列化 serializer=self.get_serializer(queryset,many=True) returnResponse(serializer.data)
举例:
fromrest_framework.mixinsimportListModelMixin fromrest_framework.genericsimportGenericAPIView classBookListView(ListModelMixin,GenericAPIView): queryset=BookInfo.objects.all() serializer_class=BookInfoSerializer defget(self,request): returnself.list(request)
1.2CreateModelMixin
创建视图扩展类,提供create(request,*args,**kwargs)方法快速实现创建资源的视图,成功返回201状态码。
- 提供create(request,*args,**kwargs)方法快速实现创建资源的视图
- 实际创建功能由序列化的save方法完成
- save方法会去调用序列化器的create方法
如果序列化器对前端发送的数据验证失败,返回400错误。
源代码:
fromrest_framework.mixinsimportCreateModelMixin classCreateModelMixin(object): """ Createamodelinstance. """ defcreate(self,request,*args,**kwargs): #获取序列化器 serializer=self.get_serializer(data=request.data) #验证 serializer.is_valid(raise_exception=True) #保存 self.perform_create(serializer) headers=self.get_success_headers(serializer.data) returnResponse(serializer.data,status=status.HTTP_201_CREATED,headers=headers) defperform_create(self,serializer): serializer.save() defget_success_headers(self,data): try: return{'Location':str(data[api_settings.URL_FIELD_NAME])} except(TypeError,KeyError): return{}
1.3RetrieveModelMixin
详情视图扩展类,提供retrieve(request,*args,**kwargs)方法,可以快速实现返回一个存在的数据对象。
如果存在,返回200,否则返回404。
源代码:
fromrest_framework.mixinsimportRetrieveModelMixin classRetrieveModelMixin(object): """ Retrieveamodelinstance. """ defretrieve(self,request,*args,**kwargs): #获取对象,会检查对象的权限 instance=self.get_object() #序列化 serializer=self.get_serializer(instance) returnResponse(serializer.data)
举例:
fromrest_framework.mixinsimportRetrieveModelMixin fromrest_framework.genericsimportGenericAPIView classBookDetailView(RetrieveModelMixin,GenericAPIView): queryset=BookInfo.objects.all() serializer_class=BookInfoSerializer defget(self,request,pk): returnself.retrieve(request)
1.4UpdateModelMixin
更新视图扩展类,提供update(request,*args,**kwargs)方法
- 可以快速实现更新一个存在的数据对象。
- 同时也提供partial_update(request,*args,**kwargs)方法,可以实现局部更新。
- 内部更新功能调用序列化器的save方法
- save方法会调用序列化器的update方法
成功返回200,序列化器校验数据失败时,返回400错误。
源代码:
fromrest_framework.mixinsimportUpdateModelMixin classUpdateModelMixin(object): """ Updateamodelinstance. """ defupdate(self,request,*args,**kwargs): partial=kwargs.pop('partial',False) instance=self.get_object() serializer=self.get_serializer(instance,data=request.data,partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) ifgetattr(instance,'_prefetched_objects_cache',None): #If'prefetch_related'hasbeenappliedtoaqueryset,weneedto #forciblyinvalidatetheprefetchcacheontheinstance. instance._prefetched_objects_cache={} returnResponse(serializer.data) defperform_update(self,serializer): serializer.save() defpartial_update(self,request,*args,**kwargs): kwargs['partial']=True returnself.update(request,*args,**kwargs)
1.5DestroyModelMixin
删除视图扩展类,提供destroy(request,*args,**kwargs)方法,可以快速实现删除一个存在的数据对象。
成功返回204,不存在返回404。
源代码:
fromrest_framework.mixinsimportDestroyModelMixin classDestroyModelMixin(object): """ Destroyamodelinstance. """ defdestroy(self,request,*args,**kwargs): instance=self.get_object() self.perform_destroy(instance) returnResponse(status=status.HTTP_204_NO_CONTENT) defperform_destroy(self,instance): instance.delete()
使用GenericAPIView和视图扩展类,实现api接口,代码:
"""GenericAPIView结合视图扩展类实现api接口""" fromrest_framework.genericsimportGenericAPIView fromrest_framework.mixinsimportListModelMixin,CreateModelMixin classStudents2GenericAPIView(GenericAPIView,ListModelMixin,CreateModelMixin): #本次视图类中要操作的数据[必填] queryset=Student.objects.all() #本次视图类中要调用的默认序列化器[玄天] serializer_class=StudentModelSerializer defget(self,request): """获取多个学生信息""" returnself.list(request) defpost(self,request): """添加学生信息""" returnself.create(request)
fromrest_framework.mixinsimportRetrieveModelMixin,UpdateModelMixin,DestroyModelMixin fromrest_framework.genericsimportGenericAPIView classStudent2GenericAPIView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin): queryset=Student.objects.all() serializer_class=StudentModelSerializer #在使用GenericAPIView视图获取或操作单个数据时,视图方法中的代表主键的参数最好是pk defget(self,request,pk): """获取一条数据""" returnself.retrieve(request,pk) defput(self,request,pk): """更新一条数据""" returnself.update(request,pk) defdelete(self,request,pk): """删除一条数据""" returnself.destroy(request,pk)
二、Generic的视图子类
2.1CreateAPIView
提供post方法
继承自:GenericAPIView、`CreateModelMixin
2.2ListAPIView
提供get方法
继承自:GenericAPIView、ListModelMixin
2.3RetrieveAPIView
提供get方法
继承自:GenericAPIView、RetrieveModelMixin
2.4DestoryAPIView
提供delete方法
继承自:GenericAPIView、DestoryModelMixin
2.5UpdateAPIView
提供put和patch方法
继承自:GenericAPIView、UpdateModelMixin
2.6RetrieveUpdateAPIView
提供get、put、patch方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin
2.7RetrieveUpdateDestoryAPIView
提供get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
以上就是本次介绍的全部知识点内容,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。