ModelViewSet 在 Django Rest Framework 中不提供 `create` url

ModelViewSet does not provide `create` url in 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)

...使用 DefaultRouter 添加到相关应用程序的 urls.py 为:

_router.register("entries", EntryViewSet, basename="entry")

然而,reverse("api:entry-create") 在我的测试中找不到 create。我还使用 Django Extensions 子命令 show_urls 快速检查了 URL,但它没有打印 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-detailentry-list 被注册 而我的模型显然不是 ReadOnlyModelViewSet.

为什么我没有api:entry-createurl?


环境

当你想使用它的pk/resource/<pk>)对特定资源做某事时,你使用detail视图,当你没有/时,list不想使用 pk。所以 list 可以用来 GET /resource,也可以用 POST /resource 来创建一个新的。当然,POST/resource映射到create方法。