From 047394f79c2cbc6cf44684a1f0d17aba1ddfe1c8 Mon Sep 17 00:00:00 2001 From: Markus Holtermann Date: Wed, 22 Jan 2014 09:06:06 +0100 Subject: [PATCH] Fixed #21852 -- Make migration writer serialize iterators --- django/db/migrations/writer.py | 11 +++++++++++ tests/migrations/test_writer.py | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py index 355ad3d90e..da56d0c171 100644 --- a/django/db/migrations/writer.py +++ b/django/db/migrations/writer.py @@ -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) diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py index 8856e8fbb3..5934f8cf47 100644 --- a/tests/migrations/test_writer.py +++ b/tests/migrations/test_writer.py @@ -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): """