Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-使用drf嵌套路由器反向嵌套url_Django_Django Rest Framework_Django Urls_Drf Nested Routers_Django Url Reverse - Fatal编程技术网

Django-使用drf嵌套路由器反向嵌套url

Django-使用drf嵌套路由器反向嵌套url,django,django-rest-framework,django-urls,drf-nested-routers,django-url-reverse,Django,Django Rest Framework,Django Urls,Drf Nested Routers,Django Url Reverse,我将api url配置为 localhost:port/app_name/students/{student_id}/macro/{macro_id}/lto 使用drf嵌套路由器扩展。基本上,每个学生都分配了一些宏观类别,这些类别依次有一些长期目标(LTO)。我已经用curl和Postman测试过了,一切似乎都正常。 现在我需要为我的LTO模型编写一个更精确的测试用例。 这是我的url.py from django.urls import path, re_path from django.

我将api url配置为

localhost:port/app_name/students/{student_id}/macro/{macro_id}/lto
使用drf嵌套路由器扩展。基本上,每个学生都分配了一些宏观类别,这些类别依次有一些长期目标(LTO)。我已经用curl和Postman测试过了,一切似乎都正常。 现在我需要为我的LTO模型编写一个更精确的测试用例。 这是我的url.py

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)),
]
这会产生以下错误

django.urls.exceptions.NoReverseMatch: 'student-detail' is not a registered namespace inside 'app_name'
在其他测试用例中,我使用非常相似的句子,这些句子很好用

self.list_url = reverse('app_name:student-list')

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

下面是一个可重复性最低的示例:

# 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
#main/url.py
从django.url导入re_路径,包括
从rest_框架导入路由器
从rest\u框架\u将嵌套路由器导入为嵌套路由器
从.viewset导入StudentViewSet,LTOViewSet
#应用程序名称空间
app_name=“main”
学生路由器=路由器。默认路由器()
学生注册(r“学生”,StudentViewSet,basename=“学生”)
lto_路由器=嵌套_路由器。嵌套简单路由器(
学生路由器,r“学生”,lookup=“学生”
)
lto_路由器寄存器(r“宏/(?P++)/lto),LTOViewSet,basename=“lto”)
URL模式=[
回复路径(“^”,包括(student\u router.url)),
re_路径(“^”,包括(lto_router.url)),
]
reverse('main:lto-detail',args=(1,1,1))
Out[5]:“/api/students/1/macro/1/lto/1/”

因此,实际上,您的错误只是传递了路由器basename,而不是要反转的最终端点,并且由于嵌套,我们被学生详细信息(我仍然不知道)抛出.

旁注:您不必创建
路由器。DefaultRouter
对象超过once@ArakkalAbu即使我不想让
student\u router
的URL与
router
的URL嵌套在一起,知道它们是什么也能帮到你吗?您正在尝试按名称空间引用lto,但尚未创建该名称空间。@Melvyn据我所知,每个名称空间对应一个应用程序名称。我把所有东西都放在一个应用程序中,所以我不应该使用其他名称空间错误消息和反向调用不匹配:
reverse('app_name:student detail:lto'
与'student detail lto'的
相反。请参见冒号与-。那么这两个词是哪一个?
student detail
不需要手动反转。一旦Django知道最终端点('lto-detail/list')),他会自动反转整个嵌套url。他只需要url-->中的参数,在这种情况下,url-->是student和宏的主键。啊,我现在明白了……当你更新错误消息时,它抱怨的是名称空间,而不是url名称。现在一切都有意义了!
# 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