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.

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