欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

django_rest_framework之GenericAPIView(一)源码讲解

发布时间:2025/3/21 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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(一)源码讲解的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。