mirror of
https://github.com/django/django.git
synced 2024-12-28 12:06:22 +00:00
e9103402c0
Complete rework of translating data values from database Deprecation of SubfieldBase, removal of resolve_columns and convert_values in favour of a more general converter based approach and public API Field.from_db_value(). Now works seamlessly with aggregation, .values() and raw queries. Thanks to akaariai in particular for extensive advice and inspiration, also to shaib, manfre and timograham for their reviews.
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, connection):
|
|
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
|