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 в вашем маршрутизаторе.
Вот обновленное предложение:
- Проверьте
@action
метод: Убедитесь, что вашlist
метод правильно определен с помощью@action
декоратора. - 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/
, который будет доступен.
Дайте мне знать, если это решит вашу проблему!