37.Django_类视图_action自定义方法

有一些我们之前用的方法中不支持的东西,我们可以单独进行定义,需要使用action装饰器来自定义方法;

serializer.py文件中添加如下代码

class ProjectNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Projects
        # 2.指定模型类都使用哪些字段,来生成序列化器
        # 使用全部字段
        fields = ("id","name")

class InterfaceNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Interfaces
        # 2.指定模型类都使用哪些字段,来生成序列化器
        # 使用全部字段
        fields = ("id","name","method")


class InterfacesByProjectIdSerializer(serializers.ModelSerializer):
    interfaces_set = InterfaceNameSerializer(read_only=True,many=True)
    class Meta:
        model = Projects
        # 2.指定模型类都使用哪些字段,来生成序列化器
        # 使用全部字段
       #注意此处的写法
        fields = ("id","interfaces_set")

views.py中选择:


class ProjectsViewSet(viewsets.ModelViewSet):
    queryset = Projects.objects.all()
    serializer_class = ProjectsModelSerializer
    filter_backends = [DjangoFilterBackend]
    ordering_fields = ['name','id']
    filterset_fields = ['name','tester']


    #1.可以使用action装饰器来声明自定义动作
    #默认情况下,实例方法名称就是动作名称
    #methods参数用于指定该动作支持的请求方法,默认为get
    #detail参数用于指定该动作用处理的是否为详情对象,(url是否需要传递pk值)

    @action(methods=['get'],detail=False)
    def names(self,request,*args,**kwargs):
         querset = self.get_queryset()
         serializer =  ProjectNameSerializer(instance=querset,many=True)
         return Response(serializer.data)

    @action(detail=False)
    def interfaces(self, request,*args,**kwargs):
        instance = self.get_object()
        serializer = InterfacesByProjectIdSerializer(instance = instance)
        return Response(serializer.data)

urls.py中修改路径如下:

from django.urls import path

from projects import views
from projects.views1 import ProjectsList, ProjectDetail
from . import views1

## 指定当前应用的命名空间
app_name = 'projects'

urlpatterns = [
    # path('', ProjectsList.as_view()),
    # path('', ProjectDetail.as_view())

    path('',views.ProjectsViewSet.as_view({
        'get':'list',
        'post':'create'
    }),name = 'projects-list'),

    path('',views.ProjectsViewSet.as_view({
        'get':'retrieve',
        'put':'update',
        'delete':'destroy'
    })),

    path('/names/',views.ProjectsViewSet.as_view({
   'get':'names',
    }),name = 'projects-names'),

    path('/interfaces/', views.ProjectsViewSet.as_view({
        'get': 'interfaces',
    }))

你可能感兴趣的:(Django)