如何使用 Django REST Framework 构建嵌套路由?

How to build a nested route with Django REST Framework?

想搭建一个简单的API,捡到Django REST Framework (DRF). I want to minimize path nesting as Tom Christie(DRF的作者)给我指出的

有两种模式:文章评论
对于这些,我想构建以下 API 路径(使用 create [C]read [R]更新 [U] 访问权限):

/                      [R]
/articles/             [R]
/articles/:id/         [R]
/articles/:id/comments [R]
/comments/             [CRU]
/comments/:id          [R]

models.py:

class Article(models.Model):
    text = models.CharField(max_length=140, blank=False)
    recorded_at = models.DateTimeField(blank=False)
    modified_at = models.DateTimeField(auto_now_add=True)


class Comment(models.Model):
    message = models.CharField(max_length=140, blank=False)
    created_at = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now_add=True)
    article = models.ForeignKey('Article', default=1, related_name='article')

serializers.py:

class ArticleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Article


class CommentSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Comment

views.py:

class ArticleViewSet(mixins.RetrieveModelMixin,
                     mixins.ListModelMixin,
                     viewsets.GenericViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer


class CommentViewSet(mixins.CreateModelMixin,
                     mixins.RetrieveModelMixin,
                     mixins.ListModelMixin,
                     viewsets.GenericViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

urls.py:

router = DefaultRouter()
router.register(r'articles', ArticleViewSet)
router.register(r'comments', CommentViewSet)


urlpatterns = patterns('',
    url(r'^', include(router.urls)),
)

根级别工作的路径:

/                      [R]
/articles/             [R]
/articles/:id/         [R]
/comments/             [CRU]
/comments/:id          [R]

然而嵌套路径returns 404.

/articles/:id/comments [R]

您的 ArticleViewSet...

需要这样的东西
@detail_route(methods=['get'])
def comments(self, request, pk=None):
    article = self.get_object()
    comments = article.comment_set.all()
    serializer = CommentSerializer(comments)
    return Response(serializer.data)