diff options
| author | Adam Johnson <me@adamj.eu> | 2025-05-11 23:08:38 +0200 |
|---|---|---|
| committer | nessita <124304+nessita@users.noreply.github.com> | 2025-05-13 21:42:19 -0300 |
| commit | 6e36f7f78415e454dcde1d9ee33f2d2c7fdfdfad (patch) | |
| tree | 605e45b5655f6186f88a623671f88a7854dc33d5 | |
| parent | 57fdc104d26df0a060f637f2128d830bfcc8e4f8 (diff) | |
Fixed #36383 -- Improved migration serialization for functools.partial objects.
| -rw-r--r-- | django/db/migrations/serializer.py | 22 | ||||
| -rw-r--r-- | tests/migrations/test_writer.py | 12 |
2 files changed, 11 insertions, 23 deletions
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) |
