mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #34529, Refs #34525 -- Reduced index operations with Meta.indexes/index_together when optimizing migrations.
This makes squashing migrations an available path for changing
Meta.index_together, which is deprecated, to Meta.indexes.
Follow up to f810325721.
This commit is contained in:
@@ -2266,10 +2266,9 @@ class AutodetectorTests(BaseAutodetectorTests):
|
||||
changes,
|
||||
"eggs",
|
||||
0,
|
||||
["CreateModel", "CreateModel", "AddIndex", "AlterUniqueTogether"],
|
||||
["CreateModel", "CreateModel"],
|
||||
)
|
||||
self.assertNotIn("unique_together", changes["eggs"][0].operations[0].options)
|
||||
self.assertNotIn("unique_together", changes["eggs"][0].operations[1].options)
|
||||
self.assertMigrationDependencies(changes, "eggs", 0, [])
|
||||
|
||||
def test_alter_db_table_add(self):
|
||||
@@ -2565,6 +2564,9 @@ class AutodetectorTests(BaseAutodetectorTests):
|
||||
|
||||
def test_create_model_with_indexes(self):
|
||||
"""Test creation of new model with indexes already defined."""
|
||||
added_index = models.Index(
|
||||
fields=["name"], name="create_model_with_indexes_idx"
|
||||
)
|
||||
author = ModelState(
|
||||
"otherapp",
|
||||
"Author",
|
||||
@@ -2573,25 +2575,25 @@ class AutodetectorTests(BaseAutodetectorTests):
|
||||
("name", models.CharField(max_length=200)),
|
||||
],
|
||||
{
|
||||
"indexes": [
|
||||
models.Index(fields=["name"], name="create_model_with_indexes_idx")
|
||||
]
|
||||
"indexes": [added_index],
|
||||
},
|
||||
)
|
||||
changes = self.get_changes([], [author])
|
||||
added_index = models.Index(
|
||||
fields=["name"], name="create_model_with_indexes_idx"
|
||||
)
|
||||
# Right number of migrations?
|
||||
self.assertEqual(len(changes["otherapp"]), 1)
|
||||
# Right number of actions?
|
||||
migration = changes["otherapp"][0]
|
||||
self.assertEqual(len(migration.operations), 2)
|
||||
self.assertEqual(len(migration.operations), 1)
|
||||
# Right actions order?
|
||||
self.assertOperationTypes(changes, "otherapp", 0, ["CreateModel", "AddIndex"])
|
||||
self.assertOperationTypes(changes, "otherapp", 0, ["CreateModel"])
|
||||
self.assertOperationAttributes(changes, "otherapp", 0, 0, name="Author")
|
||||
self.assertOperationAttributes(
|
||||
changes, "otherapp", 0, 1, model_name="author", index=added_index
|
||||
changes,
|
||||
"otherapp",
|
||||
0,
|
||||
0,
|
||||
name="Author",
|
||||
options={"indexes": [added_index]},
|
||||
)
|
||||
|
||||
def test_add_indexes(self):
|
||||
@@ -4043,62 +4045,69 @@ class AutodetectorTests(BaseAutodetectorTests):
|
||||
},
|
||||
)
|
||||
|
||||
def test_add_model_order_with_respect_to_index_constraint(self):
|
||||
tests = [
|
||||
(
|
||||
"AddIndex",
|
||||
{
|
||||
"indexes": [
|
||||
models.Index(fields=["_order"], name="book_order_idx"),
|
||||
]
|
||||
},
|
||||
),
|
||||
(
|
||||
"AddConstraint",
|
||||
{
|
||||
"constraints": [
|
||||
models.CheckConstraint(
|
||||
check=models.Q(_order__gt=1),
|
||||
name="book_order_gt_1",
|
||||
),
|
||||
]
|
||||
},
|
||||
),
|
||||
]
|
||||
for operation, extra_option in tests:
|
||||
with self.subTest(operation=operation):
|
||||
after = ModelState(
|
||||
"testapp",
|
||||
"Author",
|
||||
[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
("name", models.CharField(max_length=200)),
|
||||
("book", models.ForeignKey("otherapp.Book", models.CASCADE)),
|
||||
],
|
||||
options={
|
||||
"order_with_respect_to": "book",
|
||||
**extra_option,
|
||||
},
|
||||
)
|
||||
changes = self.get_changes([], [self.book, after])
|
||||
self.assertNumberMigrations(changes, "testapp", 1)
|
||||
self.assertOperationTypes(
|
||||
changes,
|
||||
"testapp",
|
||||
0,
|
||||
[
|
||||
"CreateModel",
|
||||
operation,
|
||||
],
|
||||
)
|
||||
self.assertOperationAttributes(
|
||||
changes,
|
||||
"testapp",
|
||||
0,
|
||||
0,
|
||||
name="Author",
|
||||
options={"order_with_respect_to": "book"},
|
||||
)
|
||||
def test_add_model_order_with_respect_to_constraint(self):
|
||||
after = ModelState(
|
||||
"testapp",
|
||||
"Author",
|
||||
[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
("name", models.CharField(max_length=200)),
|
||||
("book", models.ForeignKey("otherapp.Book", models.CASCADE)),
|
||||
],
|
||||
options={
|
||||
"order_with_respect_to": "book",
|
||||
"constraints": [
|
||||
models.CheckConstraint(
|
||||
check=models.Q(_order__gt=1), name="book_order_gt_1"
|
||||
),
|
||||
],
|
||||
},
|
||||
)
|
||||
changes = self.get_changes([], [self.book, after])
|
||||
self.assertNumberMigrations(changes, "testapp", 1)
|
||||
self.assertOperationTypes(
|
||||
changes,
|
||||
"testapp",
|
||||
0,
|
||||
["CreateModel", "AddConstraint"],
|
||||
)
|
||||
self.assertOperationAttributes(
|
||||
changes,
|
||||
"testapp",
|
||||
0,
|
||||
0,
|
||||
name="Author",
|
||||
options={"order_with_respect_to": "book"},
|
||||
)
|
||||
|
||||
def test_add_model_order_with_respect_to_index(self):
|
||||
after = ModelState(
|
||||
"testapp",
|
||||
"Author",
|
||||
[
|
||||
("id", models.AutoField(primary_key=True)),
|
||||
("name", models.CharField(max_length=200)),
|
||||
("book", models.ForeignKey("otherapp.Book", models.CASCADE)),
|
||||
],
|
||||
options={
|
||||
"order_with_respect_to": "book",
|
||||
"indexes": [models.Index(fields=["_order"], name="book_order_idx")],
|
||||
},
|
||||
)
|
||||
changes = self.get_changes([], [self.book, after])
|
||||
self.assertNumberMigrations(changes, "testapp", 1)
|
||||
self.assertOperationTypes(changes, "testapp", 0, ["CreateModel"])
|
||||
self.assertOperationAttributes(
|
||||
changes,
|
||||
"testapp",
|
||||
0,
|
||||
0,
|
||||
name="Author",
|
||||
options={
|
||||
"order_with_respect_to": "book",
|
||||
"indexes": [models.Index(fields=["_order"], name="book_order_idx")],
|
||||
},
|
||||
)
|
||||
|
||||
def test_set_alter_order_with_respect_to_index_constraint_unique_together(self):
|
||||
tests = [
|
||||
|
||||
Reference in New Issue
Block a user