From 17a79d503302f3aad5e2439d858d6e3cbba102e4 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Mon, 13 Sep 2010 05:08:10 +0000 Subject: [PATCH] Changed the way we create class names for deferred field models to avoid problems when people have hundreds of fields on model. Maximum class name length is now 80 characters and uses a hash when necessary. git-svn-id: http://code.djangoproject.com/svn/django/trunk@13819 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/backends/util.py | 6 +++--- django/db/models/query_utils.py | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) 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])