我想构建一个简单的 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)
