如何使用/ download /扩展我的端点?

时间:2019-05-29 11:23:27

标签: django python-3.x django-rest-framework

我的代码如下:

# models.py
class Recording(models.Model):
    title = . . . 
    duration = . . .

# views.py
class RecordingViewSet(viewsets.ModelViewSet):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = RecordingSerializer
    . . . 

# urls.py
router = routers.DefaultRouter()
router.register(r'recordings', RecordingViewSet, base_name='recordings')

如何扩展端点以创建/ records / X /端点? (在我的情况下,X =下载)

2 个答案:

答案 0 :(得分:1)

您可以更改当前的urls.py来创建一个具有ViewSet的终结点,以处理下载。

您可以通过添加以下内容来创建此端点:

router.register(r'recordings/download', RecordingViewSet, base_name='recordings/download')

进入/recordings/download/时,您将运行RecordingViewSet中的所有功能。

您还可以保留/recordings并为该端点分配一个不同的ViewSet,如下所示:

router.register(r'recordings', SomeViewSet, base_name='recordings')

DRF-Docs关于django-rest-framework中路由器的工作方式。

答案 1 :(得分:1)

如果您使用的是Django Rest Framework 3.8+版本,则还可以将@action装饰器用于viewset下的特定端点和操作。例如;

from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response


# views.py
class RecordingViewSet(viewsets.ModelViewSet):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = RecordingSerializer

    @action(detail=False, methods=["GET"])
    def download(self, request):
        # your logic here
        context = {'message': 'hi!'}
        return Response(context, status=status.HTTP_200_OK)

,您将能够以/recordings/download/的身份访问此端点。

请参见here中的其他用法示例和说明。