Django 对于版本化API,使用名称空间URL进行基本反转

Django 对于版本化API,使用名称空间URL进行基本反转,django,django-rest-framework,Django,Django Rest Framework,我使用django rest框架进行名称空间版本控制。我的主URL.py如下所示: ... url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')), ... reverse('v1:some') 在my_api.api_url.py中: urlpatterns = [ url(r'^some-endpoint/$', api_views.MyView.as_view(), name='s

我使用django rest框架进行名称空间版本控制。我的主URL.py如下所示:

...
url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')),
...
reverse('v1:some')
在my_api.api_url.py中:

urlpatterns = [
    url(r'^some-endpoint/$', api_views.MyView.as_view(), name='some'),
]
不知何故,我无法逆转这些网址。为什么我不能这么做?我得到一个
NoReverseMatch
异常

reverse('some')
我无法理解django的名称空间,但它不应该只使用最后定义的路由吗?如果我从主url中删除namespace参数,一切都正常

编辑

也不起作用:

reverse('v1:some') 
我还可以添加,在我的主URL文件中,我在api/v1/前缀中包含多个URL文件:

...
url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')),
url(r'^api/v1/', include('my_other_api.api_urls', app_name="api", namespace='v1')),
...

在django中反转url名称时,必须使用
名称空间:url名称
模式进行反转

您的反向呼叫应如下所示:

...
url(r'^api/v1/', include('my_api.api_urls', app_name="api", namespace='v1')),
...
reverse('v1:some')
见:


更新:在多个url条目上使用相同的命名空间。保持url名称空间的唯一性。

您是否尝试过此方法:??请确保您使用rest\u framework中的
。反向导入反向
的反向功能。对不起,运气不好。我想那一定是我的配置出了问题。这可能与在多个包含上使用相同前缀的相同命名空间有关吗?当我将特定api的名称空间更改为其他名称空间(例如“v2”)并使用reverse('v2:some')时,它会工作。是的,很可能是这样。具有相同命名空间的多个URL可能会导致问题。尝试更改名称空间啊,那一定是问题所在。所以,根据经验,只使用一次名称空间,然后包含其中的子URL?@Ruben:哦,我已经很久没有修改过这个了,所以我对这个话题并不完全陌生。我在每个API版本中使用一个主URL文件,并包含其中的所有内容。如下所示:
url(r'^api/v1/',include('main.api\u url\u v1',namespace='v1'))
。在api_url_v1中:
url_模式=[url(r'app1/',include('app1.api.api_url'))、url(r'app2/',include('app2.api.api_url_v1'))]
。这种方法的好处是,您可以为每个应用程序独立连接版本。缺点是,它有点冗长。