django < int:pk>或{pk}在DRF路由器中不起作用

5lhxktic  于 2022-11-26  发布在  Go
关注(0)|答案(3)|浏览(180)

我有一个评论,它有一个文章外键(所以文章有一个“数组”的评论)。我需要建立一个网址来获取这些评论使用文章的pk,但当我试图做smth像“articles/int:article_pk/comments/”或“articles/{article_pk}/comments/”drf路由器创建静态路由与路径“articles/{article_pk}/comments/"。我如何实现获得评论使用文章pk?
urls.py

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

nbysray51#

您也可以使用此相同的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中,使用GET方法点击url articles/<article_id>/comments/以获取评论列表

nqwrtyyt

nqwrtyyt2#

它不起作用,因为路由器不是这样使用的。注册时不要指定密钥,而是使用视图集来定义它。请阅读[1]中的文档。[1]:https://www.django-rest-framework.org/api-guide/routers/#simplerouter

iovurdzv

iovurdzv3#

路由器确实不能做到这一点。您需要在path中捕获article_pk,然后使用两个路由器,因此:

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)),
]

相关问题