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

2024-10-01 09:41:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Django Rest Framework视图集和路由器设置一个url,并尝试让url接受两个值:首先,通过user id过滤对象,然后根据对象的id(在我的例子中,对象来自一个名为Request的模型)例如,mysite.com/api/requestsbyuser/1/将返回user 1的所有Request对象,并且mysite.com/api/requestsbyuser/1/23/将为user 1返回带有pk=23Request对象。在

现在我有:

# 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模式:

^{pr2}$

我错过什么了吗?我原以为DRF路由器会用单个对象主键值来处理url路径,但它似乎把前缀后面的url当作一个整数来处理,而忽略了/。在


Tags: 对象djangofromimportcomapiidurl
1条回答
网友
1楼 · 发布于 2024-10-01 09:41:37

一个想法:您是否尝试在regex中使用\d+而不是{}?在

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

它应该强制user_id为一个数字,从而避免得到{}

相关问题 更多 >