fields.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import random
  2. import string
  3. from django.db import models
  4. class MyWrapper:
  5. def __init__(self, value):
  6. self.value = value
  7. def __repr__(self):
  8. return "<%s: %s>" % (self.__class__.__name__, self.value)
  9. def __str__(self):
  10. return self.value
  11. def __eq__(self, other):
  12. if isinstance(other, self.__class__):
  13. return self.value == other.value
  14. return self.value == other
  15. class MyAutoField(models.CharField):
  16. def __init__(self, *args, **kwargs):
  17. kwargs['max_length'] = 10
  18. super().__init__(*args, **kwargs)
  19. def pre_save(self, instance, add):
  20. value = getattr(instance, self.attname, None)
  21. if not value:
  22. value = MyWrapper(''.join(random.sample(string.ascii_lowercase, 10)))
  23. setattr(instance, self.attname, value)
  24. return value
  25. def to_python(self, value):
  26. if not value:
  27. return
  28. if not isinstance(value, MyWrapper):
  29. value = MyWrapper(value)
  30. return value
  31. def from_db_value(self, value, expression, connection):
  32. if not value:
  33. return
  34. return MyWrapper(value)
  35. def get_db_prep_save(self, value, connection):
  36. if not value:
  37. return
  38. if isinstance(value, MyWrapper):
  39. return str(value)
  40. return value
  41. def get_db_prep_value(self, value, connection, prepared=False):
  42. if not value:
  43. return
  44. if isinstance(value, MyWrapper):
  45. return str(value)
  46. return value