Django Rest Framework 路由器中的多个整数参数 URL
Multiple Integer Arguments in Django Rest Framework Router URL
我正在使用 Django Rest Framework 视图集和路由器设置 url,我试图让 url 接受两个值:首先,通过 user id
,然后通过对象的id。 (在我的例子中,对象来自一个名为 Request 的模型。)例如,mysite.com/api/requestsbyuser/1/
将 return 所有 Request
个对象用于 user 1
,而 mysite.com/api/requestsbyuser/1/23/
将return Request
对象 pk=23
for user 1
.
现在我有:
# urls.py
from django.conf.urls import url, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(prefix=r'requestsbyuser/(?P<user_id>.+)', viewset=views.RequestsByUser, base_name='request')
urlpatterns = [
url(r'^', include(router.urls)),
]
# views.py
class RequestsByUser(viewsets.ModelViewSet):
serializer_class = RequestsSerializer
def get_queryset(self):
u_id = self.kwargs['user_id']
return Request.objects.filter(user_id=u_id)
当 url 仅传入 user_id
时,这适用于列出所有 Request
对象。但是当我尝试转到 mysite.com/api/requestsbyuser/1/23/
时,出现错误:
invalid literal for int() with base 10: '1/23'
.
Django 调试说我的 URLConf 中有以下四种 url 模式:
^api/ ^ ^requestsbyuser/(?P<user_id>.+)/$ [name='request-list']
^api/ ^ ^requestsbyuser/(?P<user_id>.+)\.(?P<format>[a-z0-9]+)/?$ [name='request-list']
^api/ ^ ^requestsbyuser/(?P<user_id>.+)/(?P<pk>[^/.]+)/$ [name='request-detail']
^api/ ^ ^requestsbyuser/(?P<user_id>.+)/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='request-detail']
我错过了什么吗?我认为 DRF 路由器会处理 url 具有单个对象主键值的路径,但它似乎将前缀后的 url 视为整数并忽略 /
.
只是一个想法:您是否尝试在正则表达式中使用 \d+
而不是 .+
?
router.register(prefix=r'requestsbyuser/(?P<user_id>\d+)', viewset=views.RequestsByUser, base_name='request')
它应该强制 user_id
是一个数字,因此避免得到 1/23
对于 DefaultRouter,您只能在前缀后使用一个参数。否则你应该使用动作装饰器。医生是这么说的。
router.register(r'users', UserViewSet)
将生成
- URL 模式:^users/$ 姓名:'user-list'
- URL 模式:^users/{pk}/$ 名称:'user-detail'
我正在使用 Django Rest Framework 视图集和路由器设置 url,我试图让 url 接受两个值:首先,通过 user id
,然后通过对象的id。 (在我的例子中,对象来自一个名为 Request 的模型。)例如,mysite.com/api/requestsbyuser/1/
将 return 所有 Request
个对象用于 user 1
,而 mysite.com/api/requestsbyuser/1/23/
将return Request
对象 pk=23
for user 1
.
现在我有:
# urls.py
from django.conf.urls import url, include
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(prefix=r'requestsbyuser/(?P<user_id>.+)', viewset=views.RequestsByUser, base_name='request')
urlpatterns = [
url(r'^', include(router.urls)),
]
# views.py
class RequestsByUser(viewsets.ModelViewSet):
serializer_class = RequestsSerializer
def get_queryset(self):
u_id = self.kwargs['user_id']
return Request.objects.filter(user_id=u_id)
当 url 仅传入 user_id
时,这适用于列出所有 Request
对象。但是当我尝试转到 mysite.com/api/requestsbyuser/1/23/
时,出现错误:
invalid literal for int() with base 10: '1/23'
.
Django 调试说我的 URLConf 中有以下四种 url 模式:
^api/ ^ ^requestsbyuser/(?P<user_id>.+)/$ [name='request-list']
^api/ ^ ^requestsbyuser/(?P<user_id>.+)\.(?P<format>[a-z0-9]+)/?$ [name='request-list']
^api/ ^ ^requestsbyuser/(?P<user_id>.+)/(?P<pk>[^/.]+)/$ [name='request-detail']
^api/ ^ ^requestsbyuser/(?P<user_id>.+)/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='request-detail']
我错过了什么吗?我认为 DRF 路由器会处理 url 具有单个对象主键值的路径,但它似乎将前缀后的 url 视为整数并忽略 /
.
只是一个想法:您是否尝试在正则表达式中使用 \d+
而不是 .+
?
router.register(prefix=r'requestsbyuser/(?P<user_id>\d+)', viewset=views.RequestsByUser, base_name='request')
它应该强制 user_id
是一个数字,因此避免得到 1/23
对于 DefaultRouter,您只能在前缀后使用一个参数。否则你应该使用动作装饰器。医生是这么说的。
router.register(r'users', UserViewSet)
将生成
- URL 模式:^users/$ 姓名:'user-list'
- URL 模式:^users/{pk}/$ 名称:'user-detail'