Django-REST框架在另一个Vi上添加一个视图集作为细节

2024-06-16 09:35:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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/可用,在/boxes/{id}/使用
router.register(r'boxes', feed.views.BoxViewSet)
是否可以在/boxes/{id}/comments/上提供评论?或者我应该设置一个单独的路由并使用GET/POST参数来引用特定的框?在


Tags: objects评论allclassclasses盒子querysetpermission
2条回答

这通常被称为嵌套路由器(或嵌套视图集),在Django-REST框架中通常不建议这样做。如果可能,您应该在api中使用一个平面表示,因此

/boxes/{id}/comments

实际上是

^{pr2}$

这在使用the built-in filtering(和maybe django-filter)的Django REST框架中实现要容易得多。它保证在将来的DRF版本中不会中断,它是recommended way at the moment。如果你感兴趣的话,HTTP API guidelines可能是一本很好的读物,这里还有一个discussion about it。在


现在,你不能总是避免使用嵌套路由器。我使用了当时可用的第三方软件包written about it in the past。从那时起,drf-extensions has integrated it并且它包含了一个合适的嵌套路由器实现,在大多数情况下都可以工作。在

我认为这样做没有任何问题(我已经在我的项目中使用了它,一切都很好)-您只需要一个带有box_idkwarg的url。这与“嵌套路由器”无关,它只是另一个通过url kwarg显式过滤的端点。在

router.register(r'boxes/(?P<box_id>\d+)/comments', BoxCommentViewSet)

然后过滤掉get_queryset中的相应注释

^{pr2}$

相关问题 更多 >