mirror of
https://github.com/django/django.git
synced 2024-12-25 10:35:48 +00:00
3886338c1d
As suggested by Anssi. This has the slightly strange side effect of
passing the expression to Expression.convert_value has the expression
passed back to it, but it allows more complex patterns of expressions.
Backport of 32d4db66b9
from master
64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
import random
|
|
import string
|
|
|
|
from django.db import models
|
|
from django.utils import six
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
|
|
|
|
@python_2_unicode_compatible
|
|
class MyWrapper(object):
|
|
def __init__(self, value):
|
|
self.value = value
|
|
|
|
def __repr__(self):
|
|
return "<%s: %s>" % (self.__class__.__name__, self.value)
|
|
|
|
def __str__(self):
|
|
return self.value
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, self.__class__):
|
|
return self.value == other.value
|
|
return self.value == other
|
|
|
|
|
|
class MyAutoField(models.CharField):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
kwargs['max_length'] = 10
|
|
super(MyAutoField, self).__init__(*args, **kwargs)
|
|
|
|
def pre_save(self, instance, add):
|
|
value = getattr(instance, self.attname, None)
|
|
if not value:
|
|
value = MyWrapper(''.join(random.sample(string.ascii_lowercase, 10)))
|
|
setattr(instance, self.attname, value)
|
|
return value
|
|
|
|
def to_python(self, value):
|
|
if not value:
|
|
return
|
|
if not isinstance(value, MyWrapper):
|
|
value = MyWrapper(value)
|
|
return value
|
|
|
|
def from_db_value(self, value, expression, connection, context):
|
|
if not value:
|
|
return
|
|
return MyWrapper(value)
|
|
|
|
def get_db_prep_save(self, value, connection):
|
|
if not value:
|
|
return
|
|
if isinstance(value, MyWrapper):
|
|
return six.text_type(value)
|
|
return value
|
|
|
|
def get_db_prep_value(self, value, connection, prepared=False):
|
|
if not value:
|
|
return
|
|
if isinstance(value, MyWrapper):
|
|
return six.text_type(value)
|
|
return value
|