簡體   English   中英

Django REST Framework將ViewSet添加為另一個ViewSet的詳細信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM