Fixed #18463 -- Forced type() argument to be a byte string

This commit is contained in:
Claude Paroz 2012-06-11 22:05:13 +02:00
parent c4c7fbcc0d
commit 3dd5d726d1
2 changed files with 9 additions and 1 deletions

View File

@ -5,6 +5,7 @@ Factored out from django.db.models.query to avoid making the main module very
large and/or so that they can be used by other modules without getting into
circular import difficulties.
"""
from __future__ import unicode_literals
from django.db.backends import util
from django.utils import tree
@ -177,7 +178,7 @@ def deferred_class_factory(model, attrs):
overrides["Meta"] = Meta
overrides["__module__"] = model.__module__
overrides["_deferred"] = True
return type(name, (model,), overrides)
return type(str(name), (model,), overrides)
# The above function is also used to unpickle model instances with deferred
# fields.

View File

@ -174,3 +174,10 @@ class DeferRegressionTest(TestCase):
qs = ResolveThis.objects.defer('num')
self.assertEqual(1, qs.count())
self.assertEqual('Foobar', qs[0].name)
def test_deferred_class_factory(self):
from django.db.models.query_utils import deferred_class_factory
new_class = deferred_class_factory(Item,
('this_is_some_very_long_attribute_name_so_modelname_truncation_is_triggered',))
self.assertEqual(new_class.__name__,
'Item_Deferred_this_is_some_very_long_attribute_nac34b1f495507dad6b02e2cb235c875e')