Django Rest Framework 路由器 URL 中的多个整数参数

hac*_*man 3 python django rest url-routing django-rest-framework

我正在使用 Django Rest Framework 视图集和路由器设置一个 url,我试图让 url 接受两个值:首先,按 a 过滤对象user id,然后按对象的 id过滤。(在我的例子中,对象来自一个名为 Request 的模型。)例如,mysite.com/api/requestsbyuser/1/将返回所有Request对象 for user 1,并mysite.com/api/requestsbyuser/1/23/返回Request带有pk=23for 的对象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)
Run Code Online (Sandbox Code Playgroud)

这适用于所有上市Request时的URL仅在传递对象user_id。但是,当我尝试转到 时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']
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我认为 DRF 路由器会处理带有单个对象主键值的 url 路径,但似乎它将前缀后的 url 视为整数并忽略/.

luc*_*luc 7

只是一个想法:您是否尝试使用\d+而不是.+在正则表达式中?

router.register(prefix=r'requestsbyuser/(?P<user_id>\d+)', viewset=views.RequestsByUser, base_name='request')
Run Code Online (Sandbox Code Playgroud)

它应该强制user_id为一个数字,因此避免得到1/23