Fixed #27914 -- Added support for nested classes in Field.deconstruct()/__repr__().

This commit is contained in:
chillaranand 2017-06-14 18:11:02 +05:30 committed by Tim Graham
parent 9f4e0fde0a
commit fb0f987f7d
2 changed files with 16 additions and 2 deletions

View File

@ -191,7 +191,7 @@ class Field(RegisterLookupMixin):
def __repr__(self): def __repr__(self):
"""Display the module, class, and name of the field.""" """Display the module, class, and name of the field."""
path = '%s.%s' % (self.__class__.__module__, self.__class__.__name__) path = '%s.%s' % (self.__class__.__module__, self.__class__.__qualname__)
name = getattr(self, 'name', None) name = getattr(self, 'name', None)
if name is not None: if name is not None:
return '<%s: %s>' % (path, name) return '<%s: %s>' % (path, name)
@ -448,7 +448,7 @@ class Field(RegisterLookupMixin):
if value is not default: if value is not default:
keywords[name] = value keywords[name] = value
# Work out path - we shorten it for known Django core fields # Work out path - we shorten it for known Django core fields
path = "%s.%s" % (self.__class__.__module__, self.__class__.__name__) path = "%s.%s" % (self.__class__.__module__, self.__class__.__qualname__)
if path.startswith("django.db.models.fields.related"): if path.startswith("django.db.models.fields.related"):
path = path.replace("django.db.models.fields.related", "django.db.models") path = path.replace("django.db.models.fields.related", "django.db.models")
if path.startswith("django.db.models.fields.files"): if path.startswith("django.db.models.fields.files"):

View File

@ -9,6 +9,11 @@ from .models import (
) )
class Nested():
class Field(models.Field):
pass
class BasicFieldTests(TestCase): class BasicFieldTests(TestCase):
def test_show_hidden_initial(self): def test_show_hidden_initial(self):
@ -33,6 +38,10 @@ class BasicFieldTests(TestCase):
f = models.fields.CharField() f = models.fields.CharField()
self.assertEqual(repr(f), '<django.db.models.fields.CharField>') self.assertEqual(repr(f), '<django.db.models.fields.CharField>')
def test_field_repr_nested(self):
"""__repr__() uses __qualname__ for nested class support."""
self.assertEqual(repr(Nested.Field()), '<model_fields.tests.Nested.Field>')
def test_field_name(self): def test_field_name(self):
""" """
A defined field name (name="fieldname") is used instead of the model A defined field name (name="fieldname") is used instead of the model
@ -85,6 +94,11 @@ class BasicFieldTests(TestCase):
field._get_default field._get_default
pickle.dumps(field) pickle.dumps(field)
def test_deconstruct_nested_field(self):
"""deconstruct() uses __qualname__ for nested class support."""
name, path, args, kwargs = Nested.Field().deconstruct()
self.assertEqual(path, 'model_fields.tests.Nested.Field')
class ChoicesTests(SimpleTestCase): class ChoicesTests(SimpleTestCase):