diff --git a/django/db/migrations/state.py b/django/db/migrations/state.py index bcdf890bd72..f5019f65ee9 100644 --- a/django/db/migrations/state.py +++ b/django/db/migrations/state.py @@ -100,6 +100,10 @@ class ModelState(object): name, path, args, kwargs = field.deconstruct() field_class = import_by_path(path) fields.append((name, field_class(*args, **kwargs))) + for field in model._meta.local_many_to_many: + name, path, args, kwargs = field.deconstruct() + field_class = import_by_path(path) + fields.append((name, field_class(*args, **kwargs))) # Extract the options options = {} for name in DEFAULT_NAMES: diff --git a/tests/migrations/test_state.py b/tests/migrations/test_state.py index 4823f28cc04..fe2092dad1a 100644 --- a/tests/migrations/test_state.py +++ b/tests/migrations/test_state.py @@ -36,6 +36,7 @@ class StateTests(TestCase): class Book(models.Model): title = models.CharField(max_length=1000) author = models.ForeignKey(Author) + contributors = models.ManyToManyField(Author) class Meta: app_label = "migrations" @@ -59,9 +60,10 @@ class StateTests(TestCase): self.assertEqual(book_state.app_label, "migrations") self.assertEqual(book_state.name, "Book") - self.assertEqual([x for x, y in book_state.fields], ["id", "title", "author"]) + self.assertEqual([x for x, y in book_state.fields], ["id", "title", "author", "contributors"]) self.assertEqual(book_state.fields[1][1].max_length, 1000) self.assertEqual(book_state.fields[2][1].null, False) + self.assertEqual(book_state.fields[3][1].__class__.__name__, "ManyToManyField") self.assertEqual(book_state.options, {"verbose_name": "tome", "db_table": "test_tome"}) self.assertEqual(book_state.bases, (models.Model, ))