Я настроил свой URL-адрес API как
localhost:port/app_name/students/{student_id}/macro/{macro_id}/lto
с помощью расширения drf-nested-routers. По сути, каждому учащемуся назначены некоторые макрокатегории, которые, в свою очередь, имеют некоторые долгосрочные цели (ДН). Я тестировал его с помощью curl и Postman, и, похоже, все работает. Теперь мне нужно написать более точный тестовый пример для моей модели LTO. Это мой urls.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)),
]
Проблема в том, что я не могу правильно использовать метод reverse (), чтобы получить URL-адрес своего LTOViewSet для его проверки.
self.url = reverse('app_name:student-detail:lto', {getattr(self.student, 'id'), getattr(self.macro, 'id')})
Это дает следующую ошибку
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']})
routers.DefaultRouter
объектов более одного раза - person JPG   schedule 25.07.2020student_router
'urls были вложены в этиrouter
? - person dc_Bita98   schedule 25.07.2020reverse('app_name:student-detail:lto'
противReverse for 'student-detail-lto'
. См. Двоеточие в сравнении с -. Так что это из двух? - person Melvyn   schedule 25.07.2020TypeError: unhashable type: 'set'
. Но чтобы добраться до сути: добавьтеprint(student_router.urls)
вышеurlpatterns
, а затем посмотрите, есть ли там сведения о студенте. - person Melvyn   schedule 25.07.2020self.url = reverse('app_name:lto-list', (getattr(self.student, 'id'), getattr(self.macro, 'id')))
Насколько я понимаю, вы всегда должны указывать -list или -detail в конце URL-адреса, который вы хотите изменить. - person dc_Bita98   schedule 25.07.2020