Django REST框架:排除特定路由,同时保留标准ViewSet



我的API使用Django REST框架(DRF(。特别是,我已经使用ModelViewSet建立了几个路由,没有太多额外的编码。特别是,我有一条类似的路线

/api/v1/collection/<key>

在所有可能的密钥中,我确实需要阻止一个特定的密钥,比如special。任何对/api/v1/collection/special具有任何HTTP谓词的请求都将导致HTTP 404错误。

我能想到两种方法:

  • 覆盖ViewSet层次结构上的某些方法。哪一个
  • urls.py中,设置一个优先级更高的URL路由来拦截此URL,如path("collection/special", view=<404View>, name="collection-exception")。这有道理吗?要路由到的适当异常视图是什么

推荐的方法是什么?以上任何一项,还是其他什么?

如果您正在使用ModelViewSet,那么您应该覆盖get_queryset()方法。如果键值错误,则引发Exception,否则返回queryset:

from rest_framework.exceptions import NotFound 
class MyModelViewSet(viewsets.ModelViewSet):
# ...
def get_queryset(self):
key = self.kwargs.get("key")
if key == "special":
raise NotFound()
return MyModel.objecs.filter(pk=key)

最新更新