old_contents: def cache_m2m(name):
      cname = '_'+name
      def fget(self):
          if not hasattr(self, cname):
              setattr(self, cname, getattr(self, name).all())
          return getattr(self, cname)
      def fset(self, value):
          setattr(self, cname, value)
      return property(fget, fset)
  
new_contents: def cache_m2m(name, cache_name=None):
      if not cache_name:
          cache_name = '_'+name
  
      def fget(self):
          if not hasattr(self, cache_name):
              setattr(self, cache_name, getattr(self, name).all())
          return getattr(self, cache_name)
      def fset(self, value):
          setattr(self, cache_name, value)
      return property(fget, fset)
  
subject: allow changing the cache name in cache_m2m property helper