通用类GeneriaAPIView代码源码分析

通用类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_querysetdef 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()

原文地址:https://www.cnblogs.com/g15009428458/p/12354571.html