Django REST Framework将ViewSet添加为另一个ViewSet的详细信息

时间:2014-12-13 20:02:12

标签: python django django-rest-framework

我有两个模型,一个盒子和一个盒子评论:

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参数来引用特定的框?

1 个答案:

答案 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 momentHTTP API guidelines可能是一个很好的阅读,如果你感兴趣的原因,那里也有discussion about it


现在,您无法始终避免使用嵌套路由器。我written about it in the past,使用当时可用的第三方软件包。从那以后,drf-extensions has integrated it它包含了一个适用于大多数情况的嵌套路由器的实现。