Django Serializer - `methodViewSet(viewsets.ViewSet)` не отображается в списке url

Я пытаюсь объединить несколько сериализаторов в один вызов API, и в результате использую viewsets.ViewSet. Я знаю, что viewsets.ModelViewSet автоматически генерирует маршруты, но при использовании viewsets.ViewSet я не вижу ожидаемого маршрута для моего API.

Когда я переключаюсь на viewsets.ModelViewSet, маршрут становится доступным. Это заставляет меня думать, что моя проблема связана с тем, как viewsets.ViewSet обрабатывает маршрутизацию.

Согласно документации (https://www.django-rest-framework.org/api-guide/viewsets/), я должен иметь возможность зарегистрировать URL, как это делается с помощью ModelViewSet. Однако маршрут не появляется при использовании viewsets.ViewSet.

Любые предложения о том, что может идти не так?

views.py

class MethodViewSet(viewsets.ViewSet):
    permission_classes = [IsAuthenticated]
    authentication_classes = [TokenAuthentication]
    
    @action(detail=False, methods=['get'], url_path='method-path')
    def list(self, request):
...

urls.py

from rest_framework.routers import DefaultRouter
from .views import (
     MethodViewSet,
     )

from rest_framework.authtoken.views import obtain_auth_token

router = DefaultRouter()
...
router.register(r'method-path', MethodViewSet, basename='methodbasename')

Похоже, что проблема, с которой вы столкнулись, связана с тем, как viewsets.ViewSet работает с DefaultRouter DRF. В отличие от ModelViewSet, ViewSet не генерирует автоматически обычные CRUD-маршруты (list, create и т. д.), если вы явно не определите их с помощью @action или пользовательских методов.

В вашем случае, поскольку вы используете viewsets.ViewSet, вам нужно убедиться, что ваш набор представлений правильно регистрирует действия в маршрутизаторе. Вы уже используете @action, что правильно, но может быть небольшая проблема с конфигурацией URL в вашем маршрутизаторе.

Вот обновленное предложение:

  1. Проверьте @action метод: Убедитесь, что ваш list метод правильно определен с помощью @action декоратора.
  2. Custom Router Configuration: В DefaultRouter при регистрации ViewSet не следует использовать basename, если у вас нет особых требований. Попробуйте удалить параметр basename и зарегистрировать без него. Это позволит маршрутизатору автоматически генерировать URL.

Вот обновленный код:

views.py

from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import TokenAuthentication

class MethodViewSet(viewsets.ViewSet):
    permission_classes = [IsAuthenticated]
    authentication_classes = [TokenAuthentication]
    
    @action(detail=False, methods=['get'], url_path='method-path')
    def list(self, request):
        # your code here
        pass

urls.py

from rest_framework.routers import DefaultRouter
from .views import MethodViewSet
from rest_framework.authtoken.views import obtain_auth_token

router = DefaultRouter()
router.register(r'method-path', MethodViewSet)

# Add this to your urlpatterns to include the router
urlpatterns = [
    ...  # your other url patterns
    path('', include(router.urls)),  # Ensure this line is present
]

Ключевые моменты:

  • Параметр basename обычно нужен для ModelViewSet, где DRF использует его для генерации имен для URL, таких как method-path-list, method-path-detail и т.д.
  • Для ViewSet, поскольку вы определяете пользовательские действия с помощью @action, вам не обязательно нужно basename, если только вы не делаете что-то особенное с соглашениями об именовании.
  • Убедитесь, что маршрутизатор правильно включен в ваш urlpatterns.

После этого должен появиться маршрут для method-path/, который будет доступен.

Дайте мне знать, если это решит вашу проблему!

Вернуться на верх