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/, который будет доступен.
Дайте мне знать, если это решит вашу проблему!