Fixed #29505 -- Removed SchemaEditor's calling of callable defaults.
Thanks Eugene Pakhomov for the suggested fix.
This commit is contained in:
parent
0cf85e6b07
commit
e62f6e0968
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue