diff --git a/django/db/backends/util.py b/django/db/backends/util.py index 7773273ba6..6f18c53fe3 100644 --- a/django/db/backends/util.py +++ b/django/db/backends/util.py @@ -105,15 +105,15 @@ def rev_typecast_decimal(d): return None return str(d) -def truncate_name(name, length=None): +def truncate_name(name, length=None, hash_len=4): """Shortens a string to a repeatable mangled version with the given length. """ if length is None or len(name) <= length: return name - hash = md5_constructor(name).hexdigest()[:4] + hash = md5_constructor(name).hexdigest()[:hash_len] - return '%s%s' % (name[:length-4], hash) + return '%s%s' % (name[:length-hash_len], hash) def format_number(value, max_digits, decimal_places): """ diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py index f75b1555ab..046749c135 100644 --- a/django/db/models/query_utils.py +++ b/django/db/models/query_utils.py @@ -9,6 +9,7 @@ circular import difficulties. import weakref from django.utils.copycompat import deepcopy +from django.db.backends import util from django.utils import tree from django.utils.datastructures import SortedDict @@ -262,9 +263,10 @@ def deferred_class_factory(model, attrs): # The app_cache wants a unique name for each model, otherwise the new class # won't be created (we get an old one back). Therefore, we generate the - # name using the passed in attrs. It's OK to reuse an old case if the attrs - # are identical. + # name using the passed in attrs. It's OK to reuse an existing class + # object if the attrs are identical. name = "%s_Deferred_%s" % (model.__name__, '_'.join(sorted(list(attrs)))) + name = util.truncate_name(name, 80, 32) overrides = dict([(attr, DeferredAttribute(attr, model)) for attr in attrs])