我正在使用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'
。
答案 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)
会产生