Loading django/db/migrations/optimizer.py +5 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ class MigrationOptimizer(object): fields=operation.fields, options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading Loading @@ -247,6 +248,7 @@ class MigrationOptimizer(object): fields=operation.fields + [(other.name, other.field)], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading @@ -261,6 +263,7 @@ class MigrationOptimizer(object): ], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading @@ -275,6 +278,7 @@ class MigrationOptimizer(object): ], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading @@ -290,6 +294,7 @@ class MigrationOptimizer(object): ], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading tests/migrations/models.py +4 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,10 @@ class UnmigratedModel(models.Model): pass class EmptyManager(models.Manager): use_in_migrations = True class FoodQuerySet(models.query.QuerySet): pass Loading tests/migrations/test_optimizer.py +89 −22 Original line number Diff line number Diff line Loading @@ -5,6 +5,8 @@ from django.db.migrations.optimizer import MigrationOptimizer from django.db import migrations from django.db import models from .models import CustomModelBase, EmptyManager class OptimizerTests(TestCase): """ Loading Loading @@ -55,13 +57,26 @@ class OptimizerTests(TestCase): """ CreateModel should absorb RenameModels. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.RenameModel("Foo", "Bar"), ], [ migrations.CreateModel("Bar", [("name", models.CharField(max_length=255))]), migrations.CreateModel( "Bar", [("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ) ], ) Loading Loading @@ -159,16 +174,29 @@ class OptimizerTests(TestCase): """ AddField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.AddField("Foo", "age", models.IntegerField()), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.CharField(max_length=255)), ("age", models.IntegerField()), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading Loading @@ -214,15 +242,28 @@ class OptimizerTests(TestCase): """ AlterField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.AlterField("Foo", "name", models.IntegerField()), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.IntegerField()), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading @@ -230,15 +271,28 @@ class OptimizerTests(TestCase): """ RenameField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.RenameField("Foo", "name", "title"), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("title", models.CharField(max_length=255)), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading Loading @@ -277,18 +331,31 @@ class OptimizerTests(TestCase): """ RemoveField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.CharField(max_length=255)), ("age", models.IntegerField()), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.RemoveField("Foo", "age"), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.CharField(max_length=255)), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading Loading
django/db/migrations/optimizer.py +5 −0 Original line number Diff line number Diff line Loading @@ -211,6 +211,7 @@ class MigrationOptimizer(object): fields=operation.fields, options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading Loading @@ -247,6 +248,7 @@ class MigrationOptimizer(object): fields=operation.fields + [(other.name, other.field)], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading @@ -261,6 +263,7 @@ class MigrationOptimizer(object): ], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading @@ -275,6 +278,7 @@ class MigrationOptimizer(object): ], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading @@ -290,6 +294,7 @@ class MigrationOptimizer(object): ], options=operation.options, bases=operation.bases, managers=operation.managers, ) ] Loading
tests/migrations/models.py +4 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,10 @@ class UnmigratedModel(models.Model): pass class EmptyManager(models.Manager): use_in_migrations = True class FoodQuerySet(models.query.QuerySet): pass Loading
tests/migrations/test_optimizer.py +89 −22 Original line number Diff line number Diff line Loading @@ -5,6 +5,8 @@ from django.db.migrations.optimizer import MigrationOptimizer from django.db import migrations from django.db import models from .models import CustomModelBase, EmptyManager class OptimizerTests(TestCase): """ Loading Loading @@ -55,13 +57,26 @@ class OptimizerTests(TestCase): """ CreateModel should absorb RenameModels. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.RenameModel("Foo", "Bar"), ], [ migrations.CreateModel("Bar", [("name", models.CharField(max_length=255))]), migrations.CreateModel( "Bar", [("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ) ], ) Loading Loading @@ -159,16 +174,29 @@ class OptimizerTests(TestCase): """ AddField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.AddField("Foo", "age", models.IntegerField()), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.CharField(max_length=255)), ("age", models.IntegerField()), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading Loading @@ -214,15 +242,28 @@ class OptimizerTests(TestCase): """ AlterField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.AlterField("Foo", "name", models.IntegerField()), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.IntegerField()), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading @@ -230,15 +271,28 @@ class OptimizerTests(TestCase): """ RenameField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), migrations.CreateModel( name="Foo", fields=[("name", models.CharField(max_length=255))], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.RenameField("Foo", "name", "title"), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("title", models.CharField(max_length=255)), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading Loading @@ -277,18 +331,31 @@ class OptimizerTests(TestCase): """ RemoveField should optimize into CreateModel. """ managers = [('objects', EmptyManager())] self.assertOptimizesTo( [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.CharField(max_length=255)), ("age", models.IntegerField()), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), migrations.RemoveField("Foo", "age"), ], [ migrations.CreateModel("Foo", [ migrations.CreateModel( name="Foo", fields=[ ("name", models.CharField(max_length=255)), ]), ], options={'verbose_name': 'Foo'}, bases=(CustomModelBase), managers=managers, ), ], ) Loading