<int:pk> или {pk} не работает в маршрутизаторе DRF

У меня есть Comment, который имеет внешний ключ Article (поэтому Article имеет "массив" комментариев). Мне нужно построить url для получения этих комментариев, используя пк статьи, но когда я пытаюсь сделать что-то вроде "articles/int:article_pk/comments/" или "articles/{article_pk}/comments/", drf router выдает статический маршрут с путем "articles/{article_pk}/comments/". Как я могу реализовать получение комментариев с помощью article pk?

urls.py

router = DefaultRouter()
router.register('articles', articleAPI.ArticleAPI, basename='articles')
router.register('articles/comments', CommentAPI,  basename='comments')

Не работает, потому что маршрутизаторы не предназначены для использования таким образом. Вы не указываете ключ при регистрации, вы используете viewset для его определения. Прочтите документацию по адресу [1]. [1]: https://www.django-rest-framework.org/api-guide/routers/#simplerouter

Маршрутизатор действительно не может этого сделать. Вам нужно будет перехватить article_pk в path, а затем работать с двумя маршрутизаторами, так:

article_router = DefaultRouter()
article_router.register('articles', articleAPI.ArticleAPI, basename='articles')

comment_router = DefaultRouter()
comment_router.register('comments', CommentAPI, basename='comments')

urlpatterns = [
    path('', include(article_router.urls)),
    path('articles/<int:article_pk>/', include(comment_router.urls)),
]

Вы можете использовать этот же url для получения комментариев.

router.register('articles', articleAPI.ArticleAPI, basename='articles')

добавьте новый метод к Article ModelViewSet

@action(methods=['get'], detail=True,
        url_path='comments', url_name='article-comments')
    article = self.get_object()
    serializer = CommentSerializer(queryset=article.comment_set.all(), many=True) # comment_set resembles the related name for article foreign key
    return Response(serializer.data)

В postman введите url articles/<article_id>/comments/ методом GET, чтобы получить список комментариев

Вернуться на верх