Как расширить мою конечную точку с помощью / download /? - PullRequest
1 голос
/ 29 мая 2019

Мой код выглядит следующим образом:

# 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')

Как я могу расширить свою конечную точку для создания / записи / X / конечной точки?(в моем случае X = скачать)

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Если вы используете Django Rest Framework версии 3.8+, вы также можете использовать @action декоратор для определенных конечных точек и действий под набором просмотра.Например,

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/.

См. Другие примеры использования и пояснения из здесь .

1 голос
/ 29 мая 2019

Вы можете изменить текущую 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.

...