问题描述
我正在为我的API使用Django REST Framework(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)