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-detail
和 entry-list
被注册 而我的模型显然不是 ReadOnlyModelViewSet
.
为什么我没有api:entry-create
url?
环境
- django ^2.2
- djangorest 框架 ^3.12.4
当你想使用它的pk
(/resource/<pk>
)对特定资源做某事时,你使用detail
视图,当你没有/时,list
不想使用 pk
。所以 list
可以用来 GET /resource
,也可以用 POST /resource
来创建一个新的。当然,POST/resource
映射到create
方法。
我的视图集如下:
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-detail
和 entry-list
被注册 而我的模型显然不是 ReadOnlyModelViewSet
.
为什么我没有api:entry-create
url?
环境
- django ^2.2
- djangorest 框架 ^3.12.4
当你想使用它的pk
(/resource/<pk>
)对特定资源做某事时,你使用detail
视图,当你没有/时,list
不想使用 pk
。所以 list
可以用来 GET /resource
,也可以用 POST /resource
来创建一个新的。当然,POST/resource
映射到create
方法。