from django.db import models from django.db.models.query_utils import DeferredAttribute class CustomTypedField(models.TextField): def db_type(self, connection): return "custom_field" class CustomDeferredAttribute(DeferredAttribute): def __get__(self, instance, cls=None): self._count_call(instance, "get") return super().__get__(instance, cls) def __set__(self, instance, value): self._count_call(instance, "set") instance.__dict__[self.field.attname] = value def _count_call(self, instance, get_or_set): count_attr = "_%s_%s_count" % (self.field.attname, get_or_set) count = getattr(instance, count_attr, 0) setattr(instance, count_attr, count + 1) class CustomDescriptorField(models.CharField): descriptor_class = CustomDeferredAttribute