【问题标题】:Multiple Integer Arguments in Django Rest Framework Router URLDjango Rest Framework路由器URL中的多个整数参数
【发布时间】:2018-07-04 09:27:18
【问题描述】:

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

现在我有:

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

^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 视为整数并忽略 /

【问题讨论】:

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


    【解决方案1】:

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

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

    它应该强制user_id 是一个数字,所以避免得到1/23

    【讨论】:

      【解决方案2】:

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

      router.register(r'users', UserViewSet)
      

      会生成

      • URL 模式:^users/$ 名称:'user-list'
      • URL 模式:^users/{pk}/$ 名称:'user-detail'

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-11
        • 2020-10-07
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多