Базовый URL-адрес для маршрутизаторов не отображается в браузерном API с сериализатором гиперссылочной модели

#django-rest-framework #router #django-urls

#django-rest-framework #маршрутизатор #django-urls

Вопрос:

Сначала немного кода: serializers.py

 class PostSerializer(serializers.HyperlinkedModelSerializer):
   class Meta:
      model  = Post
      fields = '__all__'

class CommentSerializer(serializers.HyperlinkedModelSerializer):
   class Meta:
      model  = Comment
      fields = '__all__'
  

В viewsets.py я просто использую model viewset и queryset для всех объектов.
Теперь в моем api.urls маршрутизаторы зарегистрированы следующим образом:

 router = routers.DefaultRouter()

router.register('posts', PostViewSet)    
router.register('comments', CommentViewSet) 

# this is what i want
urlpatterns = [
   re_path(r'api/', include(router.urls),

]

urlpatterns  = router.urls
  

Как вы можете видеть, базовый URL-адрес для маршрутизаторов — api/ .
Когда я захожу на localhost:8000/api/comments/, я получаю правильный вывод.
Но затем в списке комментариев для конкретного комментария я получаю

 {
   "url": "localhost:8000/comments/1/",
   "post": "localhost:8000/posts/1/"
}
  

Обратите внимание на отсутствие базового URL-адреса (api/)..
Вместо этого я ожидаю

 {
   "url": "localhost:8000/api/comments/1/",
   "post": "localhost:8000/api/posts/1/"
}
  

Кроме того, если я перейду к localhost:8000/api / commnets/1/ или localhost:8000/comments /1/, я получу правильный индивидуальный комментарий.

Мой вопрос сводится к тому, почему api / отсутствует в URL-адресе в браузерном API и как его решить.

Ответ №1:

В моем приложении urls.py,

Я изменил path(‘ ‘, include(‘app_name.api.urls’)) на path(‘api/’, include(‘app_name.api.urls’))

Затем в api.urls изменил re_path (r ‘api/ ‘, include(router.urls)) на path (‘ ‘, include(router.urls))