Skip to main content
 首页 » 编程设计

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

2024年08月16日36落叶

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

当仅在 user_id 中传递 url 时,这适用于列出所有 Request 对象。但是当我尝试访问 mysite.com/api/requestsbyuser/1/23/ 时,出现错误: 以 10 为底的 int() 的无效文字:'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