12

我想向我的 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 查找 url 名称,例如'user-list''user-detail'而不是'api:user-list'我希望发生的事情。

我假设对此有一个简单的解决方案(这似乎是一件非常标准的事情),但我在 django-rest-framework 文档中找不到任何解决方案。如果我从文档中遗漏了一些东西,请分享一个链接,或者如果我接近这个错误(即“你为什么要这样做,这是不好的做法”或其他什么)请解释为什么或管理 api url 的正确方法会是。谢谢!

4

2 回答 2

5

目前对此有一个拉取请求。请随时加入讨论。

于 2013-10-28T08:11:07.900 回答
4

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

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

让我们EventViewSet从OP的问题中获取。对于这个视图集,应该有一个模型类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字段的示例。

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

class EventSerializer(serializers.HyperlinkedModelSerializer):
    comments = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='api:comment-detail'
    )
于 2018-01-26T14:24:37.483 回答