matobaの備忘録

和歌山と東京を往復しつつ活動するエンジニアの記録

DRFでURLパラメータでリソースを指定してViewSetやRouterを作りたい

DRFでURLにパラメータを含んだRouterを作りたいと思った。

調べたところ、次の質問にたどり着いた。

stackoverflow.com

stackoverflow.com

まず、以下のような形で、正規表現を作る。

router.register(
    r"project/(?P<project_id>\d+)/task",
    ProjectTaskViewSet
)

そして、ViewSet側では、 lookup_url_kwarg を指定して、それを元にQuerySetを絞り込む。

from rest_framework.mixins import ListModelMixin
from rest_framework.viewsets import GenericViewSet

class ProjectTaskViewSet(ListModelMixin, GenericViewSet):

    queryset = Task.objects.all()
    serializer_class = ProjectTaskSerializer
    lookup_url_kwarg = "project_id"

    def get_queryset(self):
        project_id = self.kwargs.get(self.lookup_url_kwarg)
        return self.queryset.filter(project=project_id)