from django.core.cache import cache

def cacheable(cache_key, timeout=3600):
    def paramed_decorator(func):
        def decorated(self):
            key = cache_key % self.__dict__
            res = cache.get(key)
            if res == None:
                res = func(self)
                cache.set(key, res, timeout)
            return res
        decorated.__doc__ = func.__doc__
        decorated.__dict__ = func.__dict__
        return decorated 
    return paramed_decorator

# Usage:

class SomeClass(models.Model):
    # fields [id, name etc]

    @cacheable("SomeClass_get_some_result_%(id)s")
    def get_some_result(self):
        # do some heavy calculations
        return heavy_calculations()

    @cacheable("SomeClass_get_something_else_%(name)s")
        return something_else_calculator(self)