Fixed #27914 -- Added support for nested classes in Field.deconstruct()/__repr__().
This commit is contained in:
parent
9f4e0fde0a
commit
fb0f987f7d
|
@ -191,7 +191,7 @@ class Field(RegisterLookupMixin):
|
|||
|
||||
def __repr__(self):
|
||||
"""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)
|
||||
if name is not None:
|
||||
return '<%s: %s>' % (path, name)
|
||||
|
@ -448,7 +448,7 @@ class Field(RegisterLookupMixin):
|
|||
if value is not default:
|
||||
keywords[name] = value
|
||||
# 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"):
|
||||
path = path.replace("django.db.models.fields.related", "django.db.models")
|
||||
if path.startswith("django.db.models.fields.files"):
|
||||
|
|
|
@ -9,6 +9,11 @@ from .models import (
|
|||
)
|
||||
|
||||
|
||||
class Nested():
|
||||
class Field(models.Field):
|
||||
pass
|
||||
|
||||
|
||||
class BasicFieldTests(TestCase):
|
||||
|
||||
def test_show_hidden_initial(self):
|
||||
|
@ -33,6 +38,10 @@ class BasicFieldTests(TestCase):
|
|||
f = 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):
|
||||
"""
|
||||
A defined field name (name="fieldname") is used instead of the model
|
||||
|
@ -85,6 +94,11 @@ class BasicFieldTests(TestCase):
|
|||
field._get_default
|
||||
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):
|
||||
|
||||
|
|
Loading…
Reference in New Issue