2016-07-20 15 views
2

私はキャッシングのためにDjango Rest FrameworkとDRF-Extensionsを使用しています。なぜdrf-extensions CacheResponseMixinキャッシュがキャッシュされていませんか?

私はカスタムlist()retrieve()メソッドを持つビューセットを持っています。私は@cache_response()デコレータをメソッドに置くことができ、それはキャッシュに成功してセットされます。しかし、私がCacheResponseMixinを使用しようとすると何も起こりません。

作品:

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) 

は動作しません:

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) 

エラーが与えられていない、私のキャッシュエントリは、単に作成されません。

+0

あなたは上書きしないでください。リストメソッド? cacheResponseMixinにキャッシュのラッピングに関する問題があるかもしれません。 – trinchet

答えて

4

ソース(およびドキュメント)を読むと、mixinクラスはデフォルトリストと検索機能を使用する場合にのみ使用されるように見えます。ソースを確認してください:

# -*- coding: utf-8 -*- 
from rest_framework_extensions.cache.decorators import cache_response 
from rest_framework_extensions.settings import extensions_api_settings 


class BaseCacheResponseMixin(object): 
    # todo: test me. Create generic test like 
    # test_cache_reponse(view_instance, method, should_rebuild_after_method_evaluation) 
    object_cache_key_func = extensions_api_settings.DEFAULT_OBJECT_CACHE_KEY_FUNC 
    list_cache_key_func = extensions_api_settings.DEFAULT_LIST_CACHE_KEY_FUNC 


class ListCacheResponseMixin(BaseCacheResponseMixin): 
    @cache_response(key_func='list_cache_key_func') 
    def list(self, request, *args, **kwargs): 
     return super(ListCacheResponseMixin, self).list(request, *args, **kwargs) 


class RetrieveCacheResponseMixin(BaseCacheResponseMixin): 
    @cache_response(key_func='object_cache_key_func') 
    def retrieve(self, request, *args, **kwargs): 
     return super(RetrieveCacheResponseMixin, self).retrieve(request, *args, **kwargs) 


class CacheResponseMixin(RetrieveCacheResponseMixin, 
         ListCacheResponseMixin): 
    pass 

ご覧のとおり、独自のリストと取得メソッドが定義されています。あなたのビューセットクラスにあなたのものを書くとき、それらは完全にバイパスします。

これは、独自のリストを作成して関数を取得する必要がある場合や、ビュー/ビューセットに組み込まれているデフォルトリストと関数を取得できる場合は、mixinクラスを使用することです。

+0

それは私の方法でスーパーを呼んでいないので、それは私が考えたものです。私はスーパーに電話をかけて、必要な作業をやり遂げる方法を見つけられませんでした。 – Soviut

関連する問題