Skip to content

Latest commit

 

History

History
40 lines (30 loc) · 2.25 KB

50.RESTful架构和DRF进阶.md

File metadata and controls

40 lines (30 loc) · 2.25 KB

RESTful架构和DRF进阶

除了上一节讲到的方法,使用DRF创建REST风格的数据接口还有CBV(基于类的视图)的方式。使用CBV创建数据接口的特点是代码简单,开发效率高,但是没有FBV(基于函数的视图)灵活,因为使用FBV的方式,数据接口对应的视图函数执行什么样的代码以及返回什么的数据是高度可定制的。下面我们以定制学科的数据接口为例,讲解通过CBV方式定制数据接口的具体做法。

使用ModelViewSet

修改之前项目中的polls/views.py,去掉show_subjects视图函数,添加一个名为SubjectViewSet的类。

class SubjectViewSet(ModelViewSet):
    queryset = Subject.objects.all()
    serializer_class = SubjectSerializer

通过查看ModelViewSet类的源代码可以发现,该类共有6个父类,其中前5个父类分别实现创建学科、获取指定学科、更新指定学科、删除指定学科和获取学科列表的数据接口,对应的方法分别是createretrieveupdatedestroylist。由于ModelViewSet的父类中已经实现了这些方法,所以我们几乎没有编写任何代码就完成了学科数据接口的开发,我们要做的仅仅是指出如何获取到学科数据(通过queryset属性指定)以及如何序列化学科数据(通过serializer_class属性指定)。

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

要使用上面的SubjectViewSet,需要在urls.py文件中进行URL映射。不同于之前的视图函数映射URL的方式,我们需要先创建一个路由器对象并通过该对象注册SubjectViewSet,然后将注册成功后生成的URL一并添加到urlspattern列表中,代码如下所示。

router = DefaultRouter()
router.register('api/subjects', SubjectViewSet)
urlpatterns += router.urls

使用APIView的子类