如何将命名空间 url 添加到 django-rest-framework 路由器视图集

Posted

技术标签:

【中文标题】如何将命名空间 url 添加到 django-rest-framework 路由器视图集【英文标题】:How to add namespace url to a django-rest-framework router viewset 【发布时间】:2013-11-05 21:40:38 【问题描述】:

我想为我的 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-framework 文档中找不到任何解决方案。如果我从文档中遗漏了一些东西,请分享一个链接,或者如果我接近这个错误(即“你为什么要这样做,这是不好的做法”或其他什么)请解释为什么或管理 api url 的正确方法会是。谢谢!

【问题讨论】:

【参考方案1】:

有一个pull request open for this currently。请随时加入讨论。

【讨论】:

太棒了! @readevalprint 的拉动大部分都有效吗?我想做出贡献,但我不想因为对整个情况的无知而污染讨论。能否简单总结一下目前还没有接受拉取的状态和主要问题? 主要原因是目前缺乏测试——它增加了一个新的行为,我们需要覆盖它(引导测试有点痛苦,所以我们需要体面的嘲笑。)——我的猜测是在通常情况下,它会是 Just Work™——如果它对您不起作用,那么了解它也很有用。不要担心污染讨论:加入。:-) 我仍然不知道如何在 DRF 中将命名空间与视图集一起使用。【参考方案2】:

这是一个非常古老的问题,Carlton Gibson 目前接受的答案只是 GitHub 上拉取请求的链接。

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

让我们从 OP 的问题中获取EventViewSet。对于这个视图集,应该有一个模型类 Event 和一个模型序列化器 EventSerializerEventSerializer 可能如下所示:

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

这是HyperlinkedModelSerializer 的示例,其中包括url 字段。

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

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

【讨论】:

这是一个非常有用的亮点,解决了我这几天一直在解决的问题。另请注意,模型中的任何 FK 或相关字段也需要添加到 extra_kwargs 列表中,以便它们的超链接正确使用路由器的命名空间

以上是关于如何将命名空间 url 添加到 django-rest-framework 路由器视图集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 linq xml 将命名空间添加到 xml

如何在 XElement 上放置命名空间别名?如何将数据源添加到现有 RDL 文档?

如何将lodash直接导入JavaScript中的自定义命名空间

XSLT 将命名空间前缀添加到元素最佳实践

应用命名空间和实例命名空间

基于请求命名空间解析 URL