summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2010-09-13 05:08:10 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2010-09-13 05:08:10 +0000
commit17a79d503302f3aad5e2439d858d6e3cbba102e4 (patch)
treed4c0fa5f77db5fac9e7ce525c393ba444775f031
parent4084bc735437e7a2e2a09cff469788e036080203 (diff)
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
-rw-r--r--django/db/backends/util.py6
-rw-r--r--django/db/models/query_utils.py6
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])