Refs #26709 -- Required a name for Indexes passed to AddIndex.

Thanks to Markush for discussions.
This commit is contained in:
Akshesh 2016-07-07 12:00:55 +05:30 committed by Tim Graham
parent f1af076fba
commit b1e7d19d4c
3 changed files with 14 additions and 5 deletions

View File

@ -751,6 +751,11 @@ class AddIndex(Operation):
def __init__(self, model_name, index): def __init__(self, model_name, index):
self.model_name = model_name self.model_name = model_name
if not index._name:
raise ValueError(
"Indexes passed to AddIndex operations require a name "
"argument. %r doesn't have one." % index
)
self.index = index self.index = index
def state_forwards(self, app_label, state): def state_forwards(self, app_label, state):

View File

@ -215,10 +215,8 @@ For example, to add an index on the ``title`` and ``author`` fields of the
), ),
] ]
If you're writing your own migration to add an index, it's recommended to pass If you're writing your own migration to add an index, you must assign a
a ``name`` to the ``index`` as done above so that you can reference it if you ``name`` to the ``index`` as done above.
later want to remove it. Otherwise, a name will be autogenerated and you'll
have to inspect the database to find the index name if you want to remove it.
``RemoveIndex`` ``RemoveIndex``
--------------- ---------------

View File

@ -1385,7 +1385,13 @@ class OperationTests(OperationTestBase):
Test the AddIndex operation. Test the AddIndex operation.
""" """
project_state = self.set_up_test_model("test_adin") project_state = self.set_up_test_model("test_adin")
index = models.Index(fields=["pink"]) msg = (
"Indexes passed to AddIndex operations require a name argument. "
"<Index: fields='pink'> doesn't have one."
)
with self.assertRaisesMessage(ValueError, msg):
migrations.AddIndex("Pony", models.Index(fields=["pink"]))
index = models.Index(fields=["pink"], name="test_adin_pony_pink_idx")
operation = migrations.AddIndex("Pony", index) operation = migrations.AddIndex("Pony", index)
self.assertEqual(operation.describe(), "Create index on field(s) pink of model Pony") self.assertEqual(operation.describe(), "Create index on field(s) pink of model Pony")
new_state = project_state.clone() new_state = project_state.clone()