mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed #24828 -- Allowed migration optimization across AlterFooTogether
The idea behind this change is, that AlterUniqueTogether,
AlterIndexTogether and AlterOrderWithRespectTo can always be moved after
an Add/Alter/Rename/RemoveField operation if they don't refer to the
respective field and are not empty sets / None.
Combined with the optimizations of duplicate AlterUniqueTogether,
AlterIndexTogether, and AlterOrderWithRespectTo operations from
128caa1e16, these operations are optimized
in a later round of the optimizer.
Thanks Tim Graham for the review.
This commit is contained in:
@@ -29,6 +29,9 @@ class OptimizerTests(SimpleTestCase):
|
||||
if less_than is not None and iterations >= less_than:
|
||||
raise self.failureException("Optimization did not take less than %s iterations (it took %s)" % (less_than, iterations))
|
||||
|
||||
def assertDoesNotOptimize(self, operations):
|
||||
self.assertOptimizesTo(operations, operations)
|
||||
|
||||
def test_single(self):
|
||||
"""
|
||||
Tests that the optimizer does nothing on a single operation,
|
||||
@@ -447,6 +450,155 @@ class OptimizerTests(SimpleTestCase):
|
||||
],
|
||||
)
|
||||
|
||||
def _test_create_alter_foo_field(self, alter):
|
||||
"""
|
||||
CreateModel, AlterFooTogether/AlterOrderWithRespectTo followed by an
|
||||
add/alter/rename field should optimize to CreateModel and the Alter*
|
||||
"""
|
||||
# AddField
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.AddField("Foo", "c", models.IntegerField()),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
("c", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
],
|
||||
)
|
||||
|
||||
# AlterField
|
||||
self.assertDoesNotOptimize(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.AlterField("Foo", "b", models.CharField(max_length=255)),
|
||||
],
|
||||
)
|
||||
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
("c", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.AlterField("Foo", "c", models.CharField(max_length=255)),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
("c", models.CharField(max_length=255)),
|
||||
]),
|
||||
alter,
|
||||
],
|
||||
)
|
||||
|
||||
# RenameField
|
||||
self.assertDoesNotOptimize(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.RenameField("Foo", "b", "c"),
|
||||
],
|
||||
)
|
||||
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.RenameField("Foo", "b", "x"),
|
||||
migrations.RenameField("Foo", "x", "c"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.RenameField("Foo", "b", "c"),
|
||||
],
|
||||
)
|
||||
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
("c", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.RenameField("Foo", "c", "d"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
("d", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
],
|
||||
)
|
||||
|
||||
# RemoveField
|
||||
self.assertDoesNotOptimize(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.RemoveField("Foo", "b"),
|
||||
],
|
||||
)
|
||||
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
("c", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
migrations.RemoveField("Foo", "c"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("a", models.IntegerField()),
|
||||
("b", models.IntegerField()),
|
||||
]),
|
||||
alter,
|
||||
],
|
||||
)
|
||||
|
||||
def test_create_alter_unique_field(self):
|
||||
self._test_create_alter_foo_field(migrations.AlterUniqueTogether("Foo", [["a", "b"]]))
|
||||
|
||||
def test_create_alter_index_field(self):
|
||||
self._test_create_alter_foo_field(migrations.AlterIndexTogether("Foo", [["a", "b"]]))
|
||||
|
||||
def test_create_alter_owrt_field(self):
|
||||
self._test_create_alter_foo_field(migrations.AlterOrderWithRespectTo("Foo", "b"))
|
||||
|
||||
def test_optimize_through_fields(self):
|
||||
"""
|
||||
Checks that field-level through checking is working.
|
||||
|
||||
Reference in New Issue
Block a user