1. from django.db import models
    
  2. from django.db.models.query_utils import DeferredAttribute
    
  3. 
    
  4. 
    
  5. class CustomTypedField(models.TextField):
    
  6.     def db_type(self, connection):
    
  7.         return "custom_field"
    
  8. 
    
  9. 
    
  10. class CustomDeferredAttribute(DeferredAttribute):
    
  11.     def __get__(self, instance, cls=None):
    
  12.         self._count_call(instance, "get")
    
  13.         return super().__get__(instance, cls)
    
  14. 
    
  15.     def __set__(self, instance, value):
    
  16.         self._count_call(instance, "set")
    
  17.         instance.__dict__[self.field.attname] = value
    
  18. 
    
  19.     def _count_call(self, instance, get_or_set):
    
  20.         count_attr = "_%s_%s_count" % (self.field.attname, get_or_set)
    
  21.         count = getattr(instance, count_attr, 0)
    
  22.         setattr(instance, count_attr, count + 1)
    
  23. 
    
  24. 
    
  25. class CustomDescriptorField(models.CharField):
    
  26.     descriptor_class = CustomDeferredAttribute