如何将命名空间 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
和一个模型序列化器 EventSerializer
。EventSerializer
可能如下所示:
class EventSerializer(serializers.HyperlinkedModelSerializer):
# any other fields
class Meta:
model = Event
# anything else
extra_kwargs =
'url': 'view_name': 'api:event-detail'
这是HyperlinkedModelSerializer
的示例,其中包括url
字段。
任何超链接字段,如HyperlinkedIdentityField
或HyperlinkedRelatedField
,以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 路由器视图集的主要内容,如果未能解决你的问题,请参考以下文章
如何在 XElement 上放置命名空间别名?如何将数据源添加到现有 RDL 文档?