<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, чтобы получить список комментариев