1. import random
    
  2. import string
    
  3. 
    
  4. from django.db import models
    
  5. 
    
  6. 
    
  7. class MyWrapper:
    
  8.     def __init__(self, value):
    
  9.         self.value = value
    
  10. 
    
  11.     def __repr__(self):
    
  12.         return "<%s: %s>" % (self.__class__.__name__, self.value)
    
  13. 
    
  14.     def __str__(self):
    
  15.         return self.value
    
  16. 
    
  17.     def __eq__(self, other):
    
  18.         if isinstance(other, self.__class__):
    
  19.             return self.value == other.value
    
  20.         return self.value == other
    
  21. 
    
  22. 
    
  23. class MyWrapperField(models.CharField):
    
  24.     def __init__(self, *args, **kwargs):
    
  25.         kwargs["max_length"] = 10
    
  26.         super().__init__(*args, **kwargs)
    
  27. 
    
  28.     def pre_save(self, instance, add):
    
  29.         value = getattr(instance, self.attname, None)
    
  30.         if not value:
    
  31.             value = MyWrapper("".join(random.sample(string.ascii_lowercase, 10)))
    
  32.             setattr(instance, self.attname, value)
    
  33.         return value
    
  34. 
    
  35.     def to_python(self, value):
    
  36.         if not value:
    
  37.             return
    
  38.         if not isinstance(value, MyWrapper):
    
  39.             value = MyWrapper(value)
    
  40.         return value
    
  41. 
    
  42.     def from_db_value(self, value, expression, connection):
    
  43.         if not value:
    
  44.             return
    
  45.         return MyWrapper(value)
    
  46. 
    
  47.     def get_db_prep_save(self, value, connection):
    
  48.         if not value:
    
  49.             return
    
  50.         if isinstance(value, MyWrapper):
    
  51.             return str(value)
    
  52.         return value
    
  53. 
    
  54.     def get_db_prep_value(self, value, connection, prepared=False):
    
  55.         if not value:
    
  56.             return
    
  57.         if isinstance(value, MyWrapper):
    
  58.             return str(value)
    
  59.         return value
    
  60. 
    
  61. 
    
  62. class MyAutoField(models.BigAutoField):
    
  63.     def from_db_value(self, value, expression, connection):
    
  64.         if value is None:
    
  65.             return None
    
  66.         return MyWrapper(value)
    
  67. 
    
  68.     def get_prep_value(self, value):
    
  69.         if value is None:
    
  70.             return None
    
  71.         return int(value)