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

问题描述

我正在为我的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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...