url 反向 Django REST Framework 路由器前置期

Django REST Framework router prepending period on url reverse

我在路由器中注册了一个 ModelViewSet

from django.conf.urls import url, include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]

所以我尝试用主键

反转url
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User

user = User.objects.get(pk=1)
url_with_args = reverse('user-list', args=[user.pk])
url_with_kwargs = reverse('user-list', kwargs={'format':user.pk})

但是 url 的值是

url_with_args == '/api/users/.1'
url_with_kwargs == '/api/users/.1'

为什么主键值中有句点?

我也尝试过与

相同的过程
rest_framework.reverse.reverse

但返回值是:

'/api/users/.1'

这里的问题是您使用 user-list 而不是 user-detail 作为命名的 URL。 user-list 意味着转到列表视图 /api/resourceuser-detail 意味着转到详细视图 /api/resource/1.

为什么 user-list 给你 /api/users/.1 是因为它匹配的正则表达式是 /api/users/.(?<format>) 其中 format 是可选的字符串,可以是这样的xmljson 并控制使用的渲染器`。

user-detail 的正则表达式是 /api/users/(?<pk>),其中 pk 是一个非可选参数,用于在检索对象时匹配主键。