mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed #28052 -- Prevented dropping Meta.indexes when changing db_index to False.
Thanks Marc Tamlyn for the report and Ian Foote/Tim Graham for review.
This commit is contained in:
committed by
Tim Graham
parent
63afe3a2bf
commit
663e48947f
@@ -29,10 +29,11 @@ from .fields import (
|
||||
CustomManyToManyField, InheritedManyToManyField, MediumBlobField,
|
||||
)
|
||||
from .models import (
|
||||
Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName, Book,
|
||||
BookForeignObj, BookWeak, BookWithLongName, BookWithO2O, BookWithoutAuthor,
|
||||
BookWithSlug, IntegerPK, Node, Note, NoteRename, Tag, TagIndexed,
|
||||
TagM2MTest, TagUniqueRename, Thing, UniqueTest, new_apps,
|
||||
Author, AuthorWithDefaultHeight, AuthorWithEvenLongerName,
|
||||
AuthorWithIndexedName, Book, BookForeignObj, BookWeak, BookWithLongName,
|
||||
BookWithO2O, BookWithoutAuthor, BookWithSlug, IntegerPK, Node, Note,
|
||||
NoteRename, Tag, TagIndexed, TagM2MTest, TagUniqueRename, Thing,
|
||||
UniqueTest, new_apps,
|
||||
)
|
||||
|
||||
|
||||
@@ -1633,6 +1634,46 @@ class SchemaTests(TransactionTestCase):
|
||||
editor.remove_index(Author, index)
|
||||
self.assertNotIn('name', self.get_indexes(Author._meta.db_table))
|
||||
|
||||
def test_remove_db_index_doesnt_remove_custom_indexes(self):
|
||||
"""
|
||||
Changing db_index to False doesn't remove indexes from Meta.indexes.
|
||||
"""
|
||||
with connection.schema_editor() as editor:
|
||||
editor.create_model(AuthorWithIndexedName)
|
||||
# Ensure the table has its index
|
||||
self.assertIn('name', self.get_indexes(AuthorWithIndexedName._meta.db_table))
|
||||
|
||||
# Add the custom index
|
||||
index = Index(fields=['-name'], name='author_name_idx')
|
||||
author_index_name = index.name
|
||||
with connection.schema_editor() as editor:
|
||||
db_index_name = editor._create_index_name(
|
||||
model=AuthorWithIndexedName,
|
||||
column_names=('name',),
|
||||
)
|
||||
if connection.features.uppercases_column_names:
|
||||
author_index_name = author_index_name.upper()
|
||||
db_index_name = db_index_name.upper()
|
||||
try:
|
||||
AuthorWithIndexedName._meta.indexes = [index]
|
||||
with connection.schema_editor() as editor:
|
||||
editor.add_index(AuthorWithIndexedName, index)
|
||||
old_constraints = self.get_constraints(AuthorWithIndexedName._meta.db_table)
|
||||
self.assertIn(author_index_name, old_constraints)
|
||||
self.assertIn(db_index_name, old_constraints)
|
||||
# Change name field to db_index=False
|
||||
old_field = AuthorWithIndexedName._meta.get_field('name')
|
||||
new_field = CharField(max_length=255)
|
||||
new_field.set_attributes_from_name('name')
|
||||
with connection.schema_editor() as editor:
|
||||
editor.alter_field(AuthorWithIndexedName, old_field, new_field, strict=True)
|
||||
new_constraints = self.get_constraints(AuthorWithIndexedName._meta.db_table)
|
||||
self.assertNotIn(db_index_name, new_constraints)
|
||||
# The index from Meta.indexes is still in the database.
|
||||
self.assertIn(author_index_name, new_constraints)
|
||||
finally:
|
||||
AuthorWithIndexedName._meta.indexes = []
|
||||
|
||||
def test_order_index(self):
|
||||
"""
|
||||
Indexes defined with ordering (ASC/DESC) defined on column
|
||||
|
||||
Reference in New Issue
Block a user