Fixed #29505 -- Removed SchemaEditor's calling of callable defaults.

Thanks Eugene Pakhomov for the suggested fix.
This commit is contained in:
Tim Graham 2018-11-17 16:18:54 -05:00
parent 0cf85e6b07
commit e62f6e0968
2 changed files with 25 additions and 6 deletions

View File

@ -212,16 +212,13 @@ class BaseDatabaseSchemaEditor:
default = datetime.now() default = datetime.now()
internal_type = field.get_internal_type() internal_type = field.get_internal_type()
if internal_type == 'DateField': if internal_type == 'DateField':
default = default.date default = default.date()
elif internal_type == 'TimeField': elif internal_type == 'TimeField':
default = default.time default = default.time()
elif internal_type == 'DateTimeField': elif internal_type == 'DateTimeField':
default = timezone.now default = timezone.now()
else: else:
default = None default = None
# If it's a callable, call it
if callable(default):
default = default()
# Convert the value so it can be sent to the database. # Convert the value so it can be sent to the database.
return field.get_db_prep_save(default, self.connection) return field.get_db_prep_save(default, self.connection)

View File

@ -0,0 +1,22 @@
from django.db import connection, models
from django.test import TestCase
class SchemaEditorTests(TestCase):
def test_effective_default_callable(self):
"""SchemaEditor.effective_default() shouldn't call callable defaults."""
class MyStr(str):
def __call__(self):
return self
class MyCharField(models.CharField):
def _get_default(self):
return self.default
def get_db_prep_save(self, default, connection):
return default
field = MyCharField(max_length=1, default=MyStr)
with connection.schema_editor() as editor:
self.assertEqual(editor.effective_default(field), MyStr)