ModelViewSet не предоставляет `create` url в Django Rest Framework
У меня есть набор представлений, как показано ниже:
class EntryViewSet(viewsets.ModelViewSet):
queryset = Entry.objects.all()
serializer_class = EntrySerializer
permission_classes = [permissions.IsOwnerStaffOrReadOnly]
filter_backends = [DjangoFilterBackend, CustomOrderingFilter]
filterset_class = EntryFilterSet
ordering_fields = ["created_at", "last_update"]
ordering = "created_at"
@method_decorator(cache_page(60 * 5, key_prefix="entry"))
def list(self, *args, **kwargs):
return super().list(*args, **kwargs)
@method_decorator(cache_page(60 * 60, key_prefix="entry"))
def retrieve(self, *args, **kwargs):
return super().retrieve(*args, **kwargs)
... который добавляется к urls.py
связанного приложения с помощью DefaultRouter
как:
_router.register("entries", EntryViewSet, basename="entry")
Однако, выполнив reverse("api:entry-create")
, я не смог найти create
на моем тесте. Я также быстро проверяю URL с помощью подкоманды Django Extensions show_urls
, но она не выводит api:entry-create
, что означает, что он не зарегистрирован. Что я делаю:
python manage.py show_urls | grep "api:entry"
Результатом является:
/api/entries/ api.viewsets.entry.EntryViewSet api:entry-list
/api/entries/<pk>/ api.viewsets.entry.EntryViewSet api:entry-detail
/api/entries/<pk>\.<format>/ api.viewsets.entry.EntryViewSet api:entry-detail
/api/entries\.<format>/ api.viewsets.entry.EntryViewSet api:entry-list
... что показывает, что только entry-detail
и entry-list
зарегистрированы , в то время как моя модель явно не зарегистрирована ReadOnlyModelViewSet
.
Почему у меня нет api:entry-create
url?
Environment
- django ^2.2
- djangorestframework ^3.12.4
Вы используете detail
представления, когда хотите сделать что-то с определенным ресурсом, используя его pk
(/resource/<pk>
), list
когда у вас нет/не хотите использовать pk
. Таким образом, list
может использоваться для GET /resource
, но также и POST /resource
для создания нового. Конечно, POST /resource
отображается на метод create
.