1
0
mirror of https://github.com/django/django.git synced 2024-12-23 01:25:58 +00:00

Fixed #35022 -- Fixed RenameIndex() crash on unnamed indexes if exists unique constraint on the same fields.

This commit is contained in:
David Wobrock 2023-12-22 09:49:56 +01:00 committed by Mariusz Felisiak
parent 6c08dba517
commit 7045661069
2 changed files with 24 additions and 1 deletions

View File

@ -1017,7 +1017,10 @@ class RenameIndex(IndexOperation):
from_model._meta.get_field(field).column for field in self.old_fields from_model._meta.get_field(field).column for field in self.old_fields
] ]
matching_index_name = schema_editor._constraint_names( matching_index_name = schema_editor._constraint_names(
from_model, column_names=columns, index=True from_model,
column_names=columns,
index=True,
unique=False,
) )
if len(matching_index_name) != 1: if len(matching_index_name) != 1:
raise ValueError( raise ValueError(

View File

@ -3626,6 +3626,26 @@ class OperationTests(OperationTestBase):
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):
operation.database_forwards(app_label, editor, project_state, new_state) operation.database_forwards(app_label, editor, project_state, new_state)
@skipUnlessDBFeature("allows_multiple_constraints_on_same_fields")
def test_rename_index_unnamed_index_with_unique_index(self):
app_label = "test_rninuniwui"
project_state = self.set_up_test_model(
app_label,
multicol_index=True,
unique_together=True,
)
table_name = app_label + "_pony"
self.assertIndexNotExists(table_name, "new_pony_test_idx")
operation = migrations.RenameIndex(
"Pony", new_name="new_pony_test_idx", old_fields=["pink", "weight"]
)
new_state = project_state.clone()
operation.state_forwards(app_label, new_state)
# Rename index.
with connection.schema_editor() as editor:
operation.database_forwards(app_label, editor, project_state, new_state)
self.assertIndexNameExists(table_name, "new_pony_test_idx")
def test_add_index_state_forwards(self): def test_add_index_state_forwards(self):
project_state = self.set_up_test_model("test_adinsf") project_state = self.set_up_test_model("test_adinsf")
index = models.Index(fields=["pink"], name="test_adinsf_pony_pink_idx") index = models.Index(fields=["pink"], name="test_adinsf_pony_pink_idx")