我的代码如下:
# 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 =下载)
答案 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中的其他用法示例和说明。