【问题标题】:ModelViewSet does not provide `create` url in Django Rest FrameworkModelViewSet 在 Django Rest Framework 中不提供`create` url
【发布时间】:2021-12-02 16:27:12
【问题描述】:

我的视图集如下:

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。我还使用 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-create 网址?


环境

  • django ^2.2
  • djangorestframework ^3.12.4

【问题讨论】:

    标签: python django django-rest-framework django-rest-viewsets


    【解决方案1】:

    当您想使用特定资源的pk (/resource/&lt;pk&gt;) 对特定资源执行某些操作时,您使用detail 视图,当您没有/不想使用pk 时使用list .所以list可以用来GET/resource,也可以用POST/resource来创建一个新的。当然,POST /resource 映射到 create 方法。

    【讨论】:

    • 实际上,这是有道理的,但在这种情况下,没有create URL 作为list 的别名仍然是违反直觉的。不过,无论如何,我认为我会坚持下去。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2021-08-10
    相关资源
    最近更新 更多