我有两个模型,一个盒子和一个盒子评论:
class BoxViewSet(viewsets.ModelViewSet):
queryset = Box.objects.all()
permission_classes = IsAuthenticated,
serializer_class = BoxSerializer
class BoxCommentViewSet(viewsets.ModelViewSet):
model = BoxComment
serializer_class = CommentSerializer
permission_classes = IsAuthenticated
def get_queryset(self):
# this should return a queryset that filters based on the
# box in the route
return BoxComment.objects.all()
如果我设置了一个路由器,可以在/boxes/
处使用Box,并使用具体框/boxes/{id}/
router.register(r'boxes', feed.views.BoxViewSet)
可以在/boxes/{id}/comments/
发表评论吗?或者我应该只设置一个单独的路由并使用GET / POST参数来引用特定的框?
答案 0 :(得分:3)
这通常称为嵌套路由器(或嵌套视图集),在Django REST Framework中通常不建议使用它。如果可能,您应该在API中使用平面表示,所以
/boxes/{id}/comments
实际上是
/comments/?box={id}
使用the built-in filtering(和maybe django-filter)使用Django REST Framework实现这一点要容易得多。保证在未来版本的DRF中不会破坏,而且它是recommended way at the moment。 HTTP API guidelines可能是一个很好的阅读,如果你感兴趣的原因,那里也有discussion about it。
现在,您无法始终避免使用嵌套路由器。我written about it in the past,使用当时可用的第三方软件包。从那以后,drf-extensions has integrated it它包含了一个适用于大多数情况的嵌套路由器的实现。