相关mod的Django REST通用视图

2024-09-26 17:57:11 发布

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

我有一个类似的设置-一个烹饪书类,它有多个食谱。在

我有一个

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

这将处理创建/列出食谱。在

{1>这类食谱必须属于一个特定的食谱列表:

/cookbook/2/recipes

只返回pk为2的食谱。在

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


Tags: 列表objectsallclassclassesquerysetpermissionserializer
2条回答

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

class CookbookListCreateView(ListCreateAPIView):
    ....

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

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

您可以创建新的路由/url: /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方法中)

相关问题 更多 >

    热门问题