2016-07-20 18 views
2

Ich verwende Django Rest Framework und die DRF-Extensions zum Caching.Warum cachesResponseMixin die Drf-Erweiterungen zwischengespeichert?

Ich habe ein Viewset mit benutzerdefinierten list() und retrieve() Methoden. Ich kann @cache_response() Dekoratoren auf die Methoden setzen und es wird erfolgreich und setzt auf den Cache. Wenn ich jedoch versuche, CacheResponseMixin zu verwenden, passiert nichts.

Works:

class SeriesViewSet(viewsets.ReadOnlyModelViewSet): 
    serializer_class = SeriesSerializer 

    def get_queryset(self): 
     series_type = EntityType.objects.get(name='series') 
     return Container.objects.filter(type=series_type) 

    @cache_response() 
    def list(self, request): 
     series = self.get_queryset() 
     serializer = SeriesSerializer(series, many=True) 
     return Response(serializer.data) 

    @cache_response() 
    def retrieve(self, request, pk=None): 
     name = pk 
     series = self.get_queryset() 
     show = series.get(data__title=name) 
     serializer = SeriesSerializer(show) 
     return Response(serializer.data) 

funktioniert nicht:

class SeriesViewSet(CacheResponseMixin, viewsets.ReadOnlyModelViewSet): 
    serializer_class = SeriesSerializer 

    def get_queryset(self): 
     series_type = EntityType.objects.get(name='series') 
     return Container.objects.filter(type=series_type) 

    def list(self, request): 
     series = self.get_queryset() 
     serializer = SeriesSerializer(series, many=True) 
     return Response(serializer.data) 

    def retrieve(self, request, pk=None): 
     name = pk 
     series = self.get_queryset() 
     show = series.get(data__title=name) 
     serializer = SeriesSerializer(show) 
     return Response(serializer.data) 

keine Fehler gegeben, mein Cache-Eintrag einfach nicht erstellt wird, erhalten.

+0

haben Sie versucht, die z. Listenmethode? Vielleicht gibt es ein Problem bei Cache-Wrapping bei 'CacheResponseMixin'. – trinchet

Antwort

4

Wenn Sie sowohl die Quelle (als auch die Dokumentation) lesen, sieht es so aus, als ob die Mixinklasse NUR für die Verwendung der Standardliste und der Abruffunktionen verwendet wird. Überprüfen Sie die Quelle:

Wie Sie sehen können, definiert es eine eigene Liste und Methoden abrufen. Wenn Sie Ihre in Ihrer Viewset-Klasse schreiben, werden diese vollständig umgangen.

Also, die Antwort ist, die Dekoratoren zu verwenden, wenn Sie Ihre eigene Liste schreiben und Funktionen abrufen müssen, oder, wenn Sie die Standardliste verwenden und Funktionen in der Ansicht/Viewset abrufen können, dann verwenden Sie die Mixin-Klasse.

+0

Das habe ich mir gedacht, da ich in meinen Methoden nicht super rufe. Ich konnte keinen Weg finden, super zu telefonieren und trotzdem die Arbeit zu machen, die ich brauchte. – Soviut