Почему я не могу использовать @action decorator для ModelViewSet в Django Rest Framework - PullRequest
1 голос
/ 18 апреля 2019

Я создаю очень простой ViewSet на User модели для CRUD пользователя.

  • Я хочу использовать декораторы ModelViewSet и @action, чтобы сделать коды чистыми.
  • Установите разрешение (просто используйте IsAuthenticated в качестве примера), необходимое для функции list.так что только те, кто подписан, могут сделать это.

Это пример кода.

from rest_framework.decorators import action, list_route
from rest_framework.permissions import IsAuthenticated

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    @action(detail=False, permission_classes=[IsAuthenticated])
    def list(self, request, *args, **kwargs):
        return super(UserViewSet, self).list(request, *args, **kwargs)

Но я получил ошибку

Невозможно использовать декоратор @action в следующих методах, так какэто существующие маршруты: список

Если я удаляю @action, это работает хорошо.У меня вопрос, почему я не могу использовать @action decorator на существующих маршрутах list?

1 Ответ

2 голосов
/ 18 апреля 2019

@action для «дополнительных действий», что фактически означает (если вы проверяете код): «не определено в роутере». Поэтому, если вы регистрируете свое представление в URL с помощью DefaultRouter или SimpleRouter, маршрутизатор выдаст эту ошибку.

Для вашего случая вы можете изменить View.get_permissions, как показано в примере документов :

from rest_framework.permissions import IsAuthenticated

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_permissions(self):
        if self.action == 'list':
            return [IsAuthenticated()]
        else:
            return super(self, UserViewSet).get_permissions()
...