Django-rest-framework中的GenericAPIView(views.APIView)类详解,理解可以提高开发效率

class GenericAPIView(views.APIView):

建议搭配源码阅读更好

 

一。属性

1. queryset = None      (重要)

     字面意思,就是models的queryset, 一般通过 models.someModel.objects.all() 赋值

 

2. serializer_class = None      (重要)

     序列化的类,可以自己定制序列化的类赋值来决定序列化哪个模型,怎么序列化

     通常的序列的语句如下:重要的是第二句,要传入 queryset 对象

planObj = models.Plan.objects.all()
planSer = myAppSerializer.PlanSerializer(instance=planObj, many=True)  # 重要
print(planSer.data)              # 这个是序列化的数据
return Response(planSer.data)

 

3. lookup_field = 'pk'                                          models中的字段名或者url中的参数名

    lookup_url_kwarg = None                              url中的参数名,就是下面PK

url('^api/v1/plan/(?P\d+)/$', views.PlanView.as_view({'get':'retrieve'}), name='plan2'),

     url 中正则表达式查询的关键参数名,上面那个是要查询的字段名,下面那个是传进来的的值名,当然只写上面那个也可以,这样两个都一样。

 

4.  filter_backends = api_settings.DEFAULT_FILTER_BACKENDS

    过滤规则,即传入参数 ?canshu=canshu,时的过滤规则,这个要自己创立一个类来进行过滤

 

5.  pagination_class = api_settings.DEFAULT_PAGINATION_CLASS      (重要)

     分页的类,可以自己定制分页的类赋值来决定分页哪个模型,怎么分页

     通常的分页的语句如下:重要的是第二句和第三句,先实例化分页对象得到pg,然后调用 paginate_queryset()来分页,当然传入的还是 queryset

roles = models.Role.objects.all()   #获取所有数据
 
pg = MyPageNumberPagination()                          # 实例化一个分页对象
pager_roles = pg.paginate_queryset(queryset=roles, request=request, view=self)    # 把querySet数据传进去
ser = PageSerialiser(instance=pager_roles, many=True)   # 对数据进行序列化
ret = pg.get_paginated_response(ser.data)
return ret

 

二。方法

1.  get_queryset(self)      (重要)

    这个方法很简单,就是返回一个你传进 queryset 属性的 queryset 对象

 

2.  get_object(self)      (重要)

    这个方法主要是获得单个模型对象:

    1. 先对 queryset 进行过滤(调用 filter_queryset 函数根据我们定制的过滤规则 filter_backends 进行过滤)

    2. 获取要筛选的字段(这里主要用的是lookup属性来进行筛选,也就是url中的参数) 

    3. 运用 get_object_or_404 获取单个对象

    4. 查看是否有权限 

    5. 返回对象

 

3. get_serializer(self)      (重要)

    获取序列化的类,获取上下文,上下文有 request 等,然后对 serializer_class(*args, **kwargs) 进行序列化,返回的是序列化对象,也就是序列化属性中的 planSer

 

4. get_serializer_class(self)

   获取我们定义的序列化类,这个可以搭配上面的方法使用

 

5. get_serializer_context(self)

   获取上下文信息,主要有 request, format, view(self)

 

6. filter_queryset(self, queryset)

   过滤 queryset , 只要知道传入 queryset,返回过滤后的 queryset。 过滤规则要另写,然后赋值给 filter_backends 就行了

 

7. paginator(self)

  1. 判断是否有分页对象

  2. 有则赋值给 self._paginator 没有则赋值 None 给 self._paginator

 

8. paginate_queryset(self, queryset)      (重要)

  1. 判断是否有分页属性

  2. 没有则返回None,有则进行分页操作,分页操作关键就是上面分页属性中的一句类似的,就是传入参数 request 和 view

return self.paginator.paginate_queryset(queryset, self.request, view=self)

 

9. get_paginated_response(self, data)

  返回的是具有额外属性 Response 的分页对象

return self.paginator.get_paginated_response(data)

 

你可能感兴趣的:(Django)