文章目录
基于类的视图的一个关键好处是:它们允许您组合一些可重用的行为。而DRF通过提供大量预构建的视图来利用这一点,为我们提供了一些常用的模式,我们要做的就是选择合适的视图类进行继承即可。
一、APIView类
DRF提供的APIView
类是Django的View
类的子类。它和一般的View
类有以下不同:
- 被传入到处理方法的请求不是Django的
HttpRequest
类的实例,而是DRF的Request类的实例。 - 处理方法可以返回DRF的
Response
,而不只是Django的HttpRequest
。视图会管理内容协议,给响应设置正确的渲染器。 - 任何
APIException
异常都会被捕获,并且传递给合适的响应。 - 传入的请求将经过身份验证,并在将请求分派给处理方法之前运行适当的权限或限频检查。
使用APIView
类和使用一般的View
类非常相似,通常,传入的请求会被分发到合适的处理方法比如get()
、post()
。我们之前一直的视图,都是继承了APIView
。
二、GenericAPIView类
此类是APIView
的子类,对APIView
类进行了扩展,添加了一些具体通用视图(后面会学到,每个视图都有具体的应用场景)都会用到的的方法。而每个具体通用视图则是通过将GenericAPIView
与一个或多个mixin类组合来构建的,即GenericAPIView
与这些mixin类是具体通用视图的父类。
2.1 常用属性
-
queryset:
设置从该视图返回对象的查询集。 比如
queryset = Book.objects
,之后就会从该查询集中获取模型对象。必须设置该属性或者重写
get_queryset()
方法。如果要覆盖一个视图方法,那么就应该调用
get_queryset()
方法而不是直接访问该属性,这是很重要的。因为DRF第一次求出queryset
的值后,就会缓存起来给所有后续的请求使用。 -
serializer_class:
设置用于验证、反序列化输入以及序列化输出的Serializer类。 必须设置此属性或者重写get_serializer_class() 方法。
-
lookup_field:查找单个模型对象时,参考的字段。默认是
'pk'
。也就是说,从路由捕获到参数命名为pk后,传入视图中,在按照pk获取模型对象时,DRF会自动将pk作为查找条件找出目标对象。不需要我们再去写
filter(pk=pk)
了。
2.2 常用方法
-
get_object(self)
:从
queryset
属性设置的模型类获取基本查询集,然后使用lookup_field
属性过滤基本查询集,最后返回一个对象实例。 -
get_queryset(self)
:返回由
queryset
属性指定的模型类的查询集。 -
get_serializer_class(self)
:默认返回
serializer_class
属性的值,即指定的序列化器类。 -
get_serializer(self, instance=None, data=None, many=False, partial=False)
:返回
serializer_class
属性指定的序列化器类的实例。
我们还是通过一个书籍相关的例子来理解上面的方法(模型类和序列化器类不是重点,自己写啊