如何使用 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)
想搭建一个简单的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)