如何将命名空间url添加到Django rest框架路由器视图

2024-03-28 15:44:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我想向我的api路由器添加一个url名称空间,但是当我这样做时,路由器仍然会查找没有名称空间的url:

router = DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'events', EventViewSet)
router.register(r'comments', CommentViewSet)

urlpatterns = patterns('apiroot.views',
                       url(r'^', include(router.urls, namespace='api')),
                       )

可浏览的api寻找像'user-list''user-detail'这样的url名称,而不是'api:user-list',这是我希望发生的事情。

我假设有一个简单的解决方案(这看起来是一个非常标准的事情想要做),但是我在django rest框架文档中找不到任何解决方案。如果我在文档中遗漏了一些内容,请共享一个链接,或者如果我搞错了(即“你为什么要这么做,这是不好的做法”或其他什么),请解释管理api url的正确方法。谢谢!


Tags: 文档名称registerapiurl空间路由器解决方案
2条回答

这是一个非常古老的问题,卡尔顿·吉布森目前接受的答案只是GitHub上一个pull请求的链接。

当搜索web以使用带有名称空间的Django REST框架路由器时,它在结果中排名第一。关于这个话题,这似乎是唯一的疑问。
因为代码示例没有具体的答案,所以我想在这里添加我的解决方案。

让我们从OP的问题中找出EventViewSet。对于这个视图集,应该有一个模型类Event和一个模型序列化器EventSerializer
EventSerializer可能是这样的:

class EventSerializer(serializers.HyperlinkedModelSerializer):
    # any other fields
    class Meta:
        model = Event
        # anything else
        extra_kwargs = {
            'url': {'view_name': 'api:event-detail'}
        }

这是包含url字段的HyperlinkedModelSerializer的示例。

任何像HyperlinkedIdentityFieldHyperlinkedRelatedField这样以view_name为参数的超链接字段,都应该在声明中或通过extra_kwargs传递包含命名空间的正确视图名称。
对于假定的CommentSerializer(对应于CommentViewSet),它可能看起来像:

class EventSerializer(serializers.HyperlinkedModelSerializer):
    comments = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='api:comment-detail'
    )

有一个pull request open for this currently。请随意参加讨论。

相关问题 更多 >