diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py index 333f39d6e0..0ee737811d 100644 --- a/django/db/migrations/writer.py +++ b/django/db/migrations/writer.py @@ -148,18 +148,9 @@ class MigrationWriter(object): return cls.serialize_deconstructed(path, args, kwargs) # Functions elif isinstance(value, (types.FunctionType, types.BuiltinFunctionType)): - # Special-cases, as these don't have im_class - special_cases = [ - (datetime.datetime.now, "datetime.datetime.now", ["import datetime"]), - (datetime.datetime.utcnow, "datetime.datetime.utcnow", ["import datetime"]), - (datetime.date.today, "datetime.date.today", ["import datetime"]), - ] - for func, string, imports in special_cases: - if func == value: # For some reason "utcnow is not utcnow" - return string, set(imports) - # Method? - if hasattr(value, "im_class"): - klass = value.im_class + # @classmethod? + if getattr(value, "__self__", None) and isinstance(value.__self__, type): + klass = value.__self__ module = klass.__module__ return "%s.%s.%s" % (module, klass.__name__, value.__name__), set(["import %s" % module]) elif hasattr(value, 'deconstruct'): diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py index dbee0d1130..3e6fe50793 100644 --- a/tests/migrations/test_writer.py +++ b/tests/migrations/test_writer.py @@ -73,6 +73,8 @@ class WriterTests(TestCase): # Datetime stuff self.assertSerializedEqual(datetime.datetime.utcnow()) self.assertSerializedEqual(datetime.datetime.utcnow) + self.assertSerializedEqual(datetime.datetime.today()) + self.assertSerializedEqual(datetime.datetime.today) self.assertSerializedEqual(datetime.date.today()) self.assertSerializedEqual(datetime.date.today) # Django fields