我在路由器中注册了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)),
]
所以我尝试用主键反转网址
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_with_args == '/api/users/.1'
url_with_kwargs == '/api/users/.1'
为什么主键值中有一段时间?
我也尝试了与
相同的过程rest_framework.reverse.reverse
但返回的值为:
'/api/users/.1'
答案 0 :(得分:0)
此处的问题是您使用user-list
而不是user-detail
作为指定的网址。 user-list
用于转到列表视图/api/resource
,而user-detail
用于转到详细信息视图/api/resource/1
。
user-list
给你/api/users/.1
的原因是因为它匹配的正则表达式为/api/users/.(?<format>)
,其中format
是可选字符串,可以是{{1}之类的字符1}}或xml
并控制使用的渲染器。
json
的正则表达式为user-detail
,其中/api/users/(?<pk>)
是一个非可选参数,用于在检索对象时匹配主键。