Django 休息框架。设置动态路由

Django rest framework. Setting up dynamic routes

我正在为博客设置 API。我为 post 配置了注释的输出 这是我的 views.py@action:

的一部分

urls.py

router = DefaultRouter()
router.register('api/posts', APIPost)

urlpatterns = [
    path('', include(router.urls)),
]

views.py

...
    @action(methods=['get'], detail=True)
    def comments(self, request, pk=None):
        if request.method == 'GET':
            queryset = Comment.objects.filter(post__id=pk)
            serializer = CommentSerializer(queryset, many=True)
            return Response(serializer.data)
        return Response(status=status.HTTP_403_FORBIDDEN)

现在我可以在 post 上获得所有评论。

http://127.0.0.1:8000/api/posts/{post_pk}/comments/

问题 是我不知道如何在

上获得单独的评论
http://127.0.0.1:8000/api/posts/{post_pk}/comments/{comment_pk}

我不断收到“404 未找到”错误

您应该定义 URL 到特定地址的路径或路线以便评论加载。 就像您定义的 APIPost 模型一样...评论 url 路线应该如下所示

router.register(r"comments", comments)

您应该创建另一个 CommentViewSet。 (docs)

views.py

from rest_framework import viewsets

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

urls.py

from .views import CommentViewSet

router = DefaultRouter()
router.register("api/posts", APIPost)
router.register("api/comments", CommentViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

然后您可以通过向 http://127.0.0.1:8000/api/comments/{pk} 发出请求来检索。


另外,在您的代码中,

  1. @action(methods=['get'], detail=True) 应该是 @action(methods=['get'], detail=False) 因为 comments 操作是检索所有评论的列表。 detail=True 用于返回单个对象。
  2. 您不需要手动检查 if request.method == 'GET',因为 DRF 已经在内部这样做了,因为您已经指定了 methods=["get"]