diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index f5cb433d6c..813c5bbd75 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -212,16 +212,13 @@ class BaseDatabaseSchemaEditor:
             default = datetime.now()
             internal_type = field.get_internal_type()
             if internal_type == 'DateField':
-                default = default.date
+                default = default.date()
             elif internal_type == 'TimeField':
-                default = default.time
+                default = default.time()
             elif internal_type == 'DateTimeField':
-                default = timezone.now
+                default = timezone.now()
         else:
             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.
         return field.get_db_prep_save(default, self.connection)
 
diff --git a/tests/backends/base/test_schema.py b/tests/backends/base/test_schema.py
new file mode 100644
index 0000000000..9f740d9326
--- /dev/null
+++ b/tests/backends/base/test_schema.py
@@ -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)