summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Johnson <me@adamj.eu>2025-05-11 23:08:38 +0200
committernessita <124304+nessita@users.noreply.github.com>2025-05-13 21:42:19 -0300
commit6e36f7f78415e454dcde1d9ee33f2d2c7fdfdfad (patch)
tree605e45b5655f6186f88a623671f88a7854dc33d5
parent57fdc104d26df0a060f637f2128d830bfcc8e4f8 (diff)
Fixed #36383 -- Improved migration serialization for functools.partial objects.
-rw-r--r--django/db/migrations/serializer.py22
-rw-r--r--tests/migrations/test_writer.py12
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)