2017-11-01 3 views
0

Ich habe eine ähnliche Konfiguration - eine Kochbuchklasse, die mehrere Rezepte hat.Django REST Generische Ansicht für verwandtes Modell

Ich habe ein

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

und diese Griffe Erstellen/die Kochbücher auflistet.

Ich brauche ein ListCreateView für das Rezept Modell, aber die Liste muss ein bestimmtes Kochbuch gehört, so dass dieser url:

/cookbook/2/recipes

nur in einem Kochbuch zurückgeben würde mit pk gefunden Rezepte 2.

Wie kann ich ListCreateAPIView ändern, um diesem Verhalten zu folgen?

Antwort

0

Sie können eine neue Route/url erstellen: /cookbook/<cookbook_pk>/recipes

Und eine api Ansicht, wie Sie wollen:

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) 

Verwenden get_cookbook, wenn Sie das Kochbuch benötigen (zB in perform_create Verfahren wie oben.)

0

Das nennt man eine "Detail Route" in DRF.

class CookbookListCreateView(ListCreateAPIView): 
    .... 

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

Es ist für einfache Fälle genügt aber in komplexeren Ansichten nested route Funktionalität von DRF-extensions verwendet, ist eine bessere Lösung.

Verwandte Themen