十二、REST framework接口开发:学习ViewSet,为后续使用ModelViewSet做铺垫

请注意:学习ViewSet是为了后面学习ModelViewSet做铺垫

前言

  学习的过程中,发现必须定义两个类才能实现增删改查查接口,那么是否可以通过一个类完成这个操作?当然可以,DRF提供了ViewSet支持这一操作。

1、编写增删改查查 接口

class CaseDataSerializer(serializers.ModelSerializer):

    class Meta:
        model = Interface_case_data
        fields = ["parent_id", "interface_case_name", "request_data", "request_expected_results"]


# 导入ListCreateAPIView和RetrieveUpdateDestroyAPIView
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView

# 导入ViewSet
from rest_framework.viewsets import ViewSet


class RequestDataView(ViewSet):
    # 认证类,没有时为空
    authentication_classes = []
    permission_classes = []

    # 定义增删改查查 方法
    def get_all(self, request, *args, **kwargs):
        return Response('get_all')

    def add_obj(self, request, *args, **kwargs):
        return Response('add_obj')

    def get_one(self, request, *args, **kwargs):
        return Response("get_one")

    def update_obj(self, request, *args, **kwargs):
        return Response("update_obj")

    def delete_obj(self, request, *args, **kwargs):
        return Response("delete_obj")

2、从ViewSet源码可以看到,此类继承了ViewSetMixin和views.APIView,而且ViewSetMixin重写了原始的路由分发机制,支持我们通过路由指定需要运行的方法

urlpatterns = [
    # 通过映射的方式,执行我们视图类中的函数,具体逻辑,请自行查看源码
    path('api/<str:version>/user/', views.RequestDataView.as_view({"get": "get_all", "post": "add_obj"})),
    # 请注意:有名分组(?P<id>\d+),不过不想定义lookup_field = 'id',把id换成pk即可
    re_path("api/(?P<version>.+)/user/(?P<id>\d+)", views.RequestDataView.as_view({"get": "get_one", "put": "update_obj", "delete": "delete_obj"})),
]

 

posted @ 2025-01-03 16:30  蜗牛·哥  阅读(5)  评论(0)    收藏  举报