Browse Source

Fixed #27217 -- Fixed crash in CreateModel optimization with models that use mixins.

Thanks Simon Charette for review.
Tim Graham 8 years ago
parent
commit
a44fc008c4
2 changed files with 12 additions and 2 deletions
  1. 4 1
      django/db/migrations/operations/models.py
  2. 8 1
      tests/migrations/test_operations.py

+ 4 - 1
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:

+ 8 - 1
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')