django_rest_framework之GenericAPIView(一)源码讲解
1、GenericAPIView是APIView的子类,所以具备APIView的所有功能
a、具备View的所有特性
b、提供了认证、授权、限流功能
c、将JsonResponse——》Response(如果是序列化输出多条数据将safe=False去掉)
d、通过request.data获取前端传递的参数,后端通过请求头中的content_Type参数,生成指定的数据类型(application / json、application / x - www - form - urlencoded、multipart / form - data)
GenericAPIView
除了具备APIView的所有功能外,还具备了自己额外的功能
2、一旦继承GenericAPIView父类(GenericAPIView的子类)
a、具备View的所有特性
b、具备了认证、授权、限流功能
c、还支持对于获取列表数据接口的功能:搜索、排序、分页
GenericAPIView需要指定queryset、serializer_class类属性
queryset:指定当前类视图的实例方法需要使用的查询集对象
serializer_class:指定当前类视图的实例方法需要的序列化器类
导入 from rest_framework.generics import GenericAPIView
3、代码最好不要直接用下列代码
queryset=self.queryset、serializer=self.serializers_class(instance=self.queryset, many=True)
建议用
queryset=self.get_queryset()
serializer = self.get_serializer(instance=queryset, many=True)
源码分析:
为什么要这么做呢?我直接用类属性queryset=self.queryset不就可以吗???
原因:为了以后可以重写get_queryset方法,例如用户有权限(获取的是完整的数据)和用户无权限(获取的是部分简单的数据)下获取到的列表数据不是一套查询集,接口之间用到的数据集不同
源码分析:
注意:
1、在实例方法中,往往使用get_queryset()方法获取查询集对象
2、一般不会直接调用queryset类属性,原因:为了提供让用户重写get_queryset()方法
3、如果未重写get_queryset()方法,那么必须得指定queryset类属性
4、在实例方法中,往往使用get_serializer方法获取序列化器类
5、一般不会直接调用serializer_class类属性,原因:为了提供让用户重写get_serializer_class()方法
6、如果未重写get_serializer_class()方法,那么必须得指定serializer_class类属性
4、get_object()方法
1、父类给提供了get_object()方法,不需要重写,直接继承,代码如下:
2、pk也不用传递,可以源码调试
结果如下图
3、如果路由视图我设置为kk
只需要在类中定义属性:lookup_url_kwarg = ‘kk’
a、lookup_url_kwarg默认为None
b、如果lookup_url_kwarg默认为None,那么lookup_url_kwarg与look_field相同(pk)
c、lookup_url_kwarg指定url路由条目中外键的路径参数名称
lookup_url_kwarg = ‘kk’
d、如果不传lookup_url_kwarg(一般不需要传递),默认为pk,如果传递的话需要在前端路由中指定
get_object可以获取模型对象,无需传递外键值
5、最后优化的代码如下:
总结
以上是生活随笔为你收集整理的django_rest_framework之GenericAPIView(一)源码讲解的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: django_rest_framewor
- 下一篇: django_rest_framewor