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

时间:2018-01-25 07:26:59

标签: python django rest django-rest-framework url-routing

我正在使用Django Rest Framework视图集和路由器设置网址,并且我试图让网址接受两个值:首先,按user id过滤对象,以及然后是对象的id。 (在我的例子中,对象来自名为Request的模型。)例如,mysite.com/api/requestsbyuser/1/将返回Request的所有user 1个对象,而mysite.com/api/requestsbyuser/1/23/将返回{{1} Request的{​​{1}}对象。

现在我有:

pk=23

当仅在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) 个对象。但是当我尝试去Request时,我收到错误: user_id

Django调试说我的URLConf中有以下四个url模式:

mysite.com/api/requestsbyuser/1/23/

我错过了什么吗?我以为DRF路由器会处理具有单个对象主键值的url路径,但似乎它将前缀后的url视为整数并忽略invalid literal for int() with base 10: '1/23'

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

在 DefaultRouter 的情况下,您只能在前缀后使用一个参数。否则你应该使用动作装饰器。医生是这么说的。

router.register(r'users', UserViewSet)

会产生

  • 网址格式:^users/$ 名称:'user-list'
  • 网址格式:^users/{pk}/$ 名称:'user-detail'

https://www.django-rest-framework.org/api-guide/routers/