相关模型的Django REST Generic View

时间:2017-11-01 05:22:14

标签: python django django-rest-framework django-views

我有一个类似于此的设置 - 一个Cookbook类,它有多个食谱。

我有一个

class CookbookListCreateView(ListCreateAPIView):
    permission_classes = (IsAuthenticated,)
    queryset = Cookbook.objects.all()
    serializer_class = CookbookSerializer

这会处理创建/列出食谱的行为。

我需要一个ListCreateView的食谱模型,但该列表必须属于一个特定的食谱,以这种方式:

/cookbook/2/recipes

只返回在食谱中找到的食谱,其中pk为2。

如何修改ListCreateAPIView以遵循此行为?

2 个答案:

答案 0 :(得分:0)

这就是DRF中的“细节路线”。

class CookbookListCreateView(ListCreateAPIView):
    ....

    @detail_route(methods=['get'])
    def recipes(self, request, **kwargs):
        # Do what you would do in a function-based view here

对于简单的情况就足够了,但使用nested route DRF-extensions功能的更复杂的视图是更好的解决方案。

答案 1 :(得分:0)

您可以创建新的路线/网址: /cookbook/<cookbook_pk>/recipes

你想要的api视图:

class RecipeListCreateView(ListCreateAPIView):
    permission_classes = (IsAuthenticated,)
    queryset = Recipe.objects.all()
    serializer_class = RecipeSerializer

    def get_cookbook(self):
        queryset = Cookbook.objects.all()
        return get_object_or_404(queryset, pk=self.kwargs['cookbook_pk'])

    def get_queryset(self):
        cookbook = self.get_cookbook()
        return super().get_queryset().filter(cookbook=cookbook)

    def perform_create(self, serializer):
        cookbook = self.get_cookbook()
        serializer.save(cookbook=cookbook)

每当您需要食谱时使用get_cookbook(例如,如上所述的perform_create方法)