通用类GeneriaAPIView代码源码分析
通用类GeneriaAPIView
代码源码分析
分析下列代码源码
class Student2GenricAPIView(GenricAPIView): queryset = Student.objects.all() serializer_class = StudentModelSerializer
def get(self,request,pk): instance = self.get_object() #获取queryset数据结果集中符合pk值的数据 serializer = self.get_serializer(instance=instance) #序列化转换数据 return Response(serializer.data) #响应数据
因为GeneriaAPIView
类中一共提供九种方法,就种方法包括def get_queryset
、def get_object
等方法
def get_queryset(self) #是获取所有数据
def get_serializer_class(self) #调整序列化器类
def get_serializer(self,args,*kwargs) #获取序列化器对象
def get_object(self) #获取一条数据
queryset #列表视图的查询集
serializer_class #视图使用的序列化器
pagination_class #分页器控制类
filter_backends #过滤控制后端
lookup_field #查询单一数据库对象时使用的条件字段,默认'pk'
lookup_url_kwarg #查询单一数据是URL中的参数关键字名称,默认与lookup_field
在def get_object方法中
验证打印结果:
minxins扩展类
ListModelMixin扩展类
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
#get_queryset 获取到所有数据
serializer = self.get_serializer(queryset, many=True) #调用序列化器对获取到的所有queryset对象转化为字典
return Response(serializer.data) #返回数据
CreateModelMixin扩展类
class CreateModelMixin: """ Create a model instance. """ def create(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) #返回新增数据,设置返回状态码 return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer): serializer.save() #保存数据 def get_success_headers(self, data): try: return {'Location': str(data[api_settings.URL_FIELD_NAME])} except (TypeError, KeyError): return {}
RetrieveModelMixin扩展类 Retrieve 详情
class RetrieveModelMixin:
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
#get_object() 根据pk获取到一条数据赋值给instance变量
instance = self.get_object()
#调用序列化器对象,将数据序列化转换数据为字典
serializer = self.get_serializer(instance)
#响应数据
return Response(serializer.data)
UpdateModelMixin扩展类
class UpdateModelMixin: """ Update a model instance. """ def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) #通过pk查询数据 instance = self.get_object() #调用序列化器对客户发送过来的数据进行验证 serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True)
#分发类方法,保存数据 self.perform_update(serializer) # if getattr(instance, '_prefetched_objects_cache', None): # If 'prefetch_related' has been applied to a queryset, we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} #返回保存数据 return Response(serializer.data) #保存数据 def perform_update(self, serializer): serializer.save() def partial_update(self, request, *args, **kwargs): kwargs['partial'] = True return self.update(request, *args, **kwargs)
DestroyModelMixin扩展类
class DestroyModelMixin: """ Destroy a model instance. """ def destroy(self, request, *args, **kwargs): #通过pk查询数据 instance = self.get_object() #调用类方法删除数据 self.perform_destroy(instance) #返回状态码 return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance): instance.delete()