fields.py 1.7 KB

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