From a44fc008c4e38fadef04021fdba564949f1aee3a Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Wed, 28 Sep 2016 10:04:52 -0400 Subject: [PATCH] Fixed #27217 -- Fixed crash in CreateModel optimization with models that use mixins. Thanks Simon Charette for review. --- django/db/migrations/operations/models.py | 5 ++++- tests/migrations/test_operations.py | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py index a0e81f5e836..027ebfe95ae 100644 --- a/django/db/migrations/operations/models.py +++ b/django/db/migrations/operations/models.py @@ -109,7 +109,10 @@ class CreateModel(ModelOperation): return True # Check we didn't inherit from the model - models_to_check = [base for base in self.bases if base is not models.Model] + models_to_check = [ + base for base in self.bases + if base is not models.Model and isinstance(base, (models.base.ModelBase, six.string_types)) + ] # Check we have no FKs/M2Ms with it for fname, field in self.fields: if field.remote_field: diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 5f96043e530..553ed58ea4f 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -4,11 +4,12 @@ import unittest from django.db import connection, migrations, models, transaction from django.db.migrations.migration import Migration +from django.db.migrations.operations import CreateModel from django.db.migrations.state import ProjectState from django.db.models.fields import NOT_PROVIDED from django.db.transaction import atomic from django.db.utils import IntegrityError -from django.test import override_settings, skipUnlessDBFeature +from django.test import SimpleTestCase, override_settings, skipUnlessDBFeature from .models import FoodManager, FoodQuerySet, UnicodeModel from .test_base import MigrationTestBase @@ -2414,3 +2415,9 @@ class SwappableOperationTests(OperationTestBase): with connection.schema_editor() as editor: operation.database_forwards('test_rminigsw', editor, project_state, new_state) operation.database_backwards('test_rminigsw', editor, new_state, project_state) + + +class TestCreateModel(SimpleTestCase): + + def test_references_model_mixin(self): + CreateModel('name', [], bases=(Mixin, models.Model)).references_model('other_model')