Django Rest Framework - Cache 'list' function but not 'retrieve' function (detail) in ModelViewSet

830 views Asked by At

I have the following code:

class OrderListViewSet(viewsets.ModelViewSet,
                       ReadOnlyCacheResponseAndETAGMixin):
    permission_classes = (NoUpdatePermission,)
    model_class = Order
    lookup_field = 'unique_reference'
    serializer_class = OrderSerializer
    pagination_class = OrderPagination

    @method_decorator(cache_page(settings.ORDER_CACHE_LIFETIME))
    def dispatch(self, *args, **kwargs):
        return super(OrderListViewSet, self).dispatch(*args, **kwargs)

    def get_serializer_class(self):
        if self.request.method == 'POST':
            return CreateOrderSerializer

        return super(OrderListViewSet, self).get_serializer_class()

    def get_queryset(self, filters=None, **kwargs):
        self.queryset = Order.objects.all()
        return super(OrderListViewSet, self).get_queryset()

    def perform_create(self, serializer):
        if not self.request.user.is_authenticated:
            _create_anonymous_user(self.request)
        serializer.save(user=self.request.user)

        return super(OrderListViewSet, self).perform_create(serializer)

I want to migrate to:

class OrderListViewSet(viewsets.ModelViewSet,
                       ReadOnlyCacheResponseAndETAGMixin):
    permission_classes = (NoUpdatePermission,)
    model_class = Order
    lookup_field = 'unique_reference'
    serializer_class = OrderSerializer
    pagination_class = OrderPagination

    @method_decorator(cache_page(settings.ORDER_CACHE_LIFETIME))
    def dispatch(self, *args, **kwargs):
        return super(OrderListViewSet, self).dispatch(*args, **kwargs)

    def get_serializer_class(self):
        if self.request.method == 'POST':
            return CreateOrderSerializer

        return super(OrderListViewSet, self).get_serializer_class()

    def get_queryset(self, filters=None, **kwargs):
        self.queryset = Order.objects.all()
        return super(OrderListViewSet, self).get_queryset()

    def perform_create(self, serializer):
        if not self.request.user.is_authenticated:
            _create_anonymous_user(self.request)
        serializer.save(user=self.request.user)

        return super(OrderListViewSet, self).perform_create(serializer)

My goal is to cache the ListView for 60 seconds but not the DetailView (always return latest data from there as it is used for long pulling).

The error which I get is: TypeError: never_cache() missing 1 required positional argument: 'view_func'

Would it be reasonable to remove the never_cache decorator all together?

0

There are 0 answers