Commit a5ec11c4 authored by Andrew Godwin's avatar Andrew Godwin
Browse files

Merge pull request #2198 from Markush2010/ticket21852

Fixed #21852 -- Make migration writer serialize iterators
parents a4fbdcdf 047394f7
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
import datetime
import inspect
import decimal
import collections
from importlib import import_module
import os
import types
@@ -257,6 +258,16 @@ class MigrationWriter(object):
            if hasattr(value, "__module__"):
                module = value.__module__
                return "%s.%s" % (module, value.__name__), set(["import %s" % module])
        # Other iterables
        elif isinstance(value, collections.Iterable):
            imports = set()
            strings = []
            for item in value:
                item_string, item_imports = cls.serialize(item)
                imports.update(item_imports)
                strings.append(item_string)
            format = "(%s)" if len(strings) > 1 else "(%s,)"
            return format % (", ".join(strings)), imports
        # Uh oh.
        else:
            raise ValueError("Cannot serialize: %r\nThere are some values Django cannot serialize into migration files.\nFor more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing" % value)
+7 −0
Original line number Diff line number Diff line
@@ -102,6 +102,13 @@ class WriterTests(TestCase):
                set(["from django.conf import settings"]),
            )
        )
        self.assertSerializedResultEqual(
            ((x, x*x) for x in range(3)),
            (
                "((0, 0), (1, 1), (2, 4))",
                set(),
            )
        )

    def test_simple_migration(self):
        """