Add model prop tracking & use Django's cached_property