我正在使用Django Rest Framework和路由器设置一个url,并试图让url接受两个值:首先,通过user id过滤对象,然后通过对象的id过滤对象。(在我的例子中,对象来自一个名为Request的模型。)例如,mysite.com/api/requestsbyuser/1/将返回user 1的所有Request对象,而mysite.com/api/requestsbyuser/1/23/将返回pk=23 For user 1的Request对象。
现在我有:
# 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只在Request中传递时,这对于列出所有的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']我是不是遗漏了什么?我认为DRF路由器会处理带有单个对象主键值的url路径,但它似乎将前缀后面的url作为一个整数来处理,而忽略了/。
发布于 2018-01-25 08:43:33
只是一个想法:在regex中,您尝试使用\d+而不是.+吗?
router.register(prefix=r'requestsbyuser/(?P<user_id>\d+)', viewset=views.RequestsByUser, base_name='request')它应该强制user_id是一个数字,从而避免获得1/23
发布于 2021-03-13 06:19:59
在DefaultRouter的情况下,只能在前缀后面使用一个参数。否则,您应该使用动作装饰。医生这么说的。
router.register(r'users', UserViewSet)会产生
https://stackoverflow.com/questions/48437653
复制相似问题