2017-11-01 1 views
0

私はこのような設定をしています。つまり、複数のレシピを持つCookbookクラスです。Django REST関連モデルの汎用ビュー

私は

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

を持っており、これは料理本をリストの作成/処理します。

私はレシピモデルのListCreateViewを必要としますが、リストには、次のURLように、特定の料理に属している必要があります

/cookbook/2/recipes

はのPKと料理で見つかっただけのレシピを返します2.

ListCreateAPIViewをこの動作に従うように変更するにはどうすればよいですか?

答えて

0

あなたは新しいルート/ URLを作成することができます

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方法で、上記のように。)

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 

これは単純な例のためではなく、DRF-extensionsnested route機能を使用して、より複雑なビューで十分ですよりよい解決策です。あなたが望むよう /cookbook/<cookbook_pk>/recipes

とAPIビュー:

関連する問題