[Day19] - Django-REST-Framework Viewsets 介绍

在第一个 API 中我们编写的 View,不知道大家有没有觉得非常简洁呢,好像没有写什麽代码,但是就完成了 GET, POST 的功能,这就是 Viewset 的威力了。今天就带大家了解一下 Viewset 在做什麽,以及如何使用!

Viewsets 介绍

在 web 当中有许多常见的功能,以及常使用的逻辑,DRF便将其进行整合进一个 class 方便开发者调用
优点

  • 重复的逻辑可以透过一个 class 进行处理
  • 透过 routers 我们可以省去编写 urls 路径的工作。

Viewsets 建立

若要建立,一般我们需要在 class 定义对应的 function

from .models import Products
from .serializers import ProductSerializer
from rest_framework import viewsets
from rest_framework.response import Response

class ProductViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving users.
    """
    def list(self, request):
        queryset = Products.objects.all()
        serializer = ProductSerializer(queryset)
        return Response(serializer.data)

而 viewset 中自己定义了六种 method ,因此我们只要获取一次 query 以及 serializer ,Viewset 将会为我们处理好以下 Method 的功能

  • list
  • create
  • retrieve
  • update
  • partial_update
  • destroy

若想要客制化功能,可以透过修改 function 再进行修改

class ProductViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.

    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """

    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

Viewsets 路径与 router

viewsets 可以自行定义对应路径

product_list = ProductViewSet.as_view({'get': 'list'})

但通常我们不会这麽做,我们会透过 router 帮助我们自动对应路径。

from .views import ProductViewSet
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'products', ProductViewSet, basename='product')
urlpatterns = router.urls

router 会自动对应到各个路径 相关的 Method !

结语

Viewsets 可以帮助我们有效率且清楚的处理许多常见的业务逻辑。Viewsets 按照不同功能,有不同的 Viewsets 可以进行选用,像是 GenericViewSet, ModelViewSet 等。我们越熟习这些工具,有助於我们增进开发的效率以及质量。

参考资料

https://www.django-rest-framework.org/api-guide/viewsets/#viewset


<<:  IOS、Python自学心得30天 Day-29 连接Firebase辨识

>>:  DAY 20 我要+1 群组团购辅助机器人(补)

【Day 11】分散式系统小总结

今天沙滩车太累ㄌ好想弃赛 透过这八堂课,也算是对分散式系统有一些初步认识, 之後再找时间接着看 M...

11. Bug x Debug x Debug Tool

Bug 在 debug 之前我们要知道什麽是 bug。 请勾选属於 bug 的东西: [ ] 正常网...

[Day 23] Node Event loop 2

前言 今天继续看看 event loop 的核心循环, uv_run() , 可以查看以下网址 ht...

python3的环境安装

我使用的版本是python3.8.6,示范安装用的目前(20210721)最新的版本 首先到官网下载...

Day 22 HTML5 <HTML5 input类型、表单标签>

HTML5新增的input类型: <!-- 需添加form表单域 --> <for...