Skip to main content
 首页 » 编程设计

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

2025年05月04日25飞鱼

我想构建一个简单的 API 并选择了 Django REST Framework (DRF) .我要minimize path nesting作为Tom Christie (DRF 的作者)向我指出。

有两种模型:文章和评论。
对于这些,我想构建以下 API 路径(具有创建 [C]、读取 [R] 和更新 [U] 访问权限):

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

模型.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') 

序列化程序.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] 

但是嵌套路径返回 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)