diff --git a/django/db/migrations/serializer.py b/django/db/migrations/serializer.py index 50d9cacdc1..cfc2657261 100644 --- a/django/db/migrations/serializer.py +++ b/django/db/migrations/serializer.py @@ -207,23 +207,11 @@ class FunctionTypeSerializer(BaseSerializer): class FunctoolsPartialSerializer(BaseSerializer): def serialize(self): - # Serialize functools.partial() arguments - func_string, func_imports = serializer_factory(self.value.func).serialize() - args_string, args_imports = serializer_factory(self.value.args).serialize() - keywords_string, keywords_imports = serializer_factory( - self.value.keywords - ).serialize() - # Add any imports needed by arguments - imports = {"import functools", *func_imports, *args_imports, *keywords_imports} - return ( - "functools.%s(%s, *%s, **%s)" - % ( - self.value.__class__.__name__, - func_string, - args_string, - keywords_string, - ), - imports, + partial_name = self.value.__class__.__name__ + return DeconstructibleSerializer.serialize_deconstructed( + f"functools.{partial_name}", + (self.value.func, *self.value.args), + self.value.keywords, ) diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py index dcc5c9e62f..29f472b85b 100644 --- a/tests/migrations/test_writer.py +++ b/tests/migrations/test_writer.py @@ -911,7 +911,7 @@ class WriterTests(SimpleTestCase): string, imports = MigrationWriter.serialize(value) self.assertSerializedFunctoolsPartialEqual( value, - "functools.partial(datetime.timedelta, *(), **{})", + "functools.partial(datetime.timedelta)", {"import datetime", "import functools"}, ) @@ -920,7 +920,7 @@ class WriterTests(SimpleTestCase): string, imports = MigrationWriter.serialize(value) self.assertSerializedFunctoolsPartialEqual( value, - "functools.partial(datetime.timedelta, *(1,), **{})", + "functools.partial(datetime.timedelta, 1)", {"import datetime", "import functools"}, ) @@ -929,7 +929,7 @@ class WriterTests(SimpleTestCase): string, imports = MigrationWriter.serialize(value) self.assertSerializedFunctoolsPartialEqual( value, - "functools.partial(datetime.timedelta, *(), **{'seconds': 2})", + "functools.partial(datetime.timedelta, seconds=2)", {"import datetime", "import functools"}, ) @@ -938,7 +938,7 @@ class WriterTests(SimpleTestCase): string, imports = MigrationWriter.serialize(value) self.assertSerializedFunctoolsPartialEqual( value, - "functools.partial(datetime.timedelta, *(1,), **{'seconds': 2})", + "functools.partial(datetime.timedelta, 1, seconds=2)", {"import datetime", "import functools"}, ) @@ -947,7 +947,7 @@ class WriterTests(SimpleTestCase): string, imports = MigrationWriter.serialize(value) self.assertSerializedFunctoolsPartialEqual( value, - "functools.partial(datetime.timedelta, *(), **{'kebab-case': 1})", + "functools.partial(datetime.timedelta, **{'kebab-case': 1})", {"import datetime", "import functools"}, ) @@ -956,7 +956,7 @@ class WriterTests(SimpleTestCase): string, imports = MigrationWriter.serialize(value) result = self.assertSerializedFunctoolsPartialEqual( value, - "functools.partialmethod(datetime.timedelta, *(1,), **{'seconds': 2})", + "functools.partialmethod(datetime.timedelta, 1, seconds=2)", {"import datetime", "import functools"}, ) self.assertIsInstance(result, functools.partialmethod)