首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -反向嵌套url与drf嵌套路由器

Django -反向嵌套url与drf嵌套路由器
EN

Stack Overflow用户
提问于 2020-07-25 16:45:07
回答 1查看 1.7K关注 0票数 1

我将我的api url配置为

代码语言:javascript
复制
localhost:port/app_name/students/{student_id}/macro/{macro_id}/lto

使用drf-nested-routers扩展。基本上,每个学生都分配了一些宏观类别,这反过来又有一些长期目标(LTO)。我用卷发和邮递员测试过它,一切似乎都正常。现在,我需要为我的LTO模型编写一个更精确的测试用例。这是我的urls.py

代码语言:javascript
复制
from django.urls import path, re_path
from django.conf.urls import include
from rest_framework import routers
from app_name.views.views import UserViewSet, StudentViewSet, MacroViewSet, LTOViewSet, MacroAssignmentViewSet
from rest_framework_nested import routers as nested_routers

# application namespace
app_name = 'app_name'

router = routers.DefaultRouter()
router.register(r'users', UserViewSet, basename='user')
router.register(r'macro', MacroViewSet, basename='macro')
router.register(r'macro-assignments', MacroAssignmentViewSet, basename='macro-assignment')

student_router = routers.DefaultRouter()
student_router.register(r'students', StudentViewSet, basename='student')
lto_router = nested_routers.NestedSimpleRouter(student_router, r'students', lookup='student')
lto_router.register(r'macro/(?P<macro_pk>.+)/lto', LTOViewSet, basename='lto')


urlpatterns = [
    re_path('^', include(router.urls)),
    re_path('^', include(student_router.urls)),
    re_path('^', include(lto_router.urls)),
]

问题是,我无法正确地使用反向()方法来获取LTOViewSet的url来测试它。

代码语言:javascript
复制
self.url = reverse('app_name:student-detail:lto', {getattr(self.student, 'id'), getattr(self.macro, 'id')})

这会产生以下错误

代码语言:javascript
复制
django.urls.exceptions.NoReverseMatch: 'student-detail' is not a registered namespace inside 'app_name'

在其他测试用例中,我使用了非常相似的句子,这些句子工作得很好。

代码语言:javascript
复制
self.list_url = reverse('app_name:student-list')

reverse('app_name:student-detail', {post_response.data['id']})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-25 18:10:13

下面是一个最少可复制的例子:

代码语言:javascript
复制
# main/viewsets.py
from rest_framework.viewsets import ModelViewSet
from django.contrib.auth.models import User, Group


class StudentViewSet(ModelViewSet):
    model = User


class LTOViewSet(ModelViewSet):
    model = Group
代码语言:javascript
复制
# main/urls.py
from django.urls import re_path, include
from rest_framework import routers

from rest_framework_nested import routers as nested_routers
from .viewsets import StudentViewSet, LTOViewSet

# application namespace
app_name = "main"

student_router = routers.DefaultRouter()
student_router.register(r"students", StudentViewSet, basename="student")
lto_router = nested_routers.NestedSimpleRouter(
    student_router, r"students", lookup="student"
)
lto_router.register(r"macro/(?P<macro_pk>.+)/lto", LTOViewSet, basename="lto")

urlpatterns = [
    re_path("^", include(student_router.urls)),
    re_path("^", include(lto_router.urls)),
]
代码语言:javascript
复制
reverse('main:lto-detail', args=(1,1,1))
Out[5]: '/api/students/1/macro/1/lto/1/'

因此,实际上,您的错误只是传递路由器basename,而不是要反转的最后一个端点,而且由于嵌套,我们被学生的细节抛出,而不是倒转(我仍然不明白)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63090926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档