我有一个如下的视图集:
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扩展子命令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?
环境
- django ^ 2.2
- djangorestframework ^ 3.12.4
你使用detail
观点当你想做一些与特定资源利用其pk
(/resource/<pk>
)list
当你没有/不想用pk
。所以可以使用list
/resource
,而且POST/resource
创建一个新的。当然,POST/resource
是映射到create
方法的。