[英]Django REST Framework add a ViewSet as detail on another ViewSet
我有兩個型號,一個盒子和一個盒子評論:
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}/
使用的特定方框中提供/boxes/{id}/
router.register(r'boxes', feed.views.BoxViewSet)
可以在/boxes/{id}/comments/
嗎? 或者我應該只設置一個單獨的路由並使用GET / POST參數來引用特定的框?
我沒有看到任何問題(我已經在我的項目中使用它,一切都很好) - 你需要的只是一個帶有box_id
kwarg的網址。 這與“嵌套路由器”沒有任何關系,它只是另一個由url kwarg進行顯式過濾的端點。
router.register(r'boxes/(?P<box_id>\d+)/comments', BoxCommentViewSet)
然后只需在get_queryset
過濾掉相應的注釋
class BoxCommentViewSet(viewsets.ModelViewSet):
def get_queryset(self):
return BoxComment.objects.filter(
box=self.kwargs['box_id']
)
這通常稱為嵌套路由器(或嵌套視圖集),並且通常不建議在Django REST Framework中使用。 如果可能,您應該在API中使用平面表示,所以
/boxes/{id}/comments
實際上是
/comments/?box={id}
使用內置過濾 ( 也許是django-filter ),使用Django REST Framework實現這一點要容易得多 。 在未來版本的DRF中保證不會中斷,這是目前推薦的方式 。 如果你感興趣的原因, HTTP API指南可能是一個很好的閱讀,並且也在那里討論它 。
現在,您不能總是避免使用嵌套路由器。 我過去曾使用當時可用的第三方軟件包寫過它 。 從那時起, drf-extensions集成了它 ,它包含一個適用於大多數情況的嵌套路由器的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.