diff --git a/django/db/migrations/serializer.py b/django/db/migrations/serializer.py index 013bb0fb00b7..17dc95fe6e37 100644 --- a/django/db/migrations/serializer.py +++ b/django/db/migrations/serializer.py @@ -222,6 +222,17 @@ def serialize(self): ) +class GenericAliasSerializer(BaseSerializer): + def serialize(self): + imports = set() + # Avoid iterating self.value, because it returns itself. + # https://github.com/python/cpython/issues/103450 + for item in self.value.__args__: + _, item_imports = serializer_factory(item).serialize() + imports.update(item_imports) + return repr(self.value), imports + + class IterableSerializer(BaseSerializer): def serialize(self): imports = set() @@ -364,6 +375,7 @@ class Serializer: decimal.Decimal: DecimalSerializer, (functools.partial, functools.partialmethod): FunctoolsPartialSerializer, FUNCTION_TYPES: FunctionTypeSerializer, + types.GenericAlias: GenericAliasSerializer, collections.abc.Iterable: IterableSerializer, (COMPILED_REGEX_TYPE, RegexObject): RegexSerializer, uuid.UUID: UUIDSerializer, diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py index b7b199d8f177..c3f43afcb835 100644 --- a/tests/migrations/test_writer.py +++ b/tests/migrations/test_writer.py @@ -1237,6 +1237,12 @@ def test_serialize_non_identifier_keyword_args(self): self.assertEqual(result.args, instance.args) self.assertEqual(result.kwargs, instance.kwargs) + def test_serialize_generic_alias(self): + self.assertSerializedEqual(dict[str, float]) + + def test_serialize_generic_alias_complex_args(self): + self.assertSerializedEqual(dict[str, models.Manager]) + def test_register_serializer(self): class ComplexSerializer(BaseSerializer): def serialize(self):