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