@@ -88,7 +88,14 @@ def remove_field(self, model, field):
8888 self ._remove_field_index (model , field )
8989
9090 def alter_index_together (self , model , old_index_together , new_index_together ):
91- pass
91+ olds = {tuple (fields ) for fields in old_index_together }
92+ news = {tuple (fields ) for fields in new_index_together }
93+ # Deleted indexes
94+ for field_names in olds .difference (news ):
95+ self ._remove_composed_index (model , field_names , {"index" : True , "unique" : False })
96+ # Created indexes
97+ for field_names in news .difference (olds ):
98+ self ._add_composed_index (model , field_names )
9299
93100 def alter_unique_together (self , model , old_unique_together , new_unique_together ):
94101 pass
@@ -124,6 +131,30 @@ def remove_index(self, model, index):
124131 return
125132 self .connection .database [model ._meta .db_table ].drop_index (index .name )
126133
134+ def _remove_composed_index (self , model , field_names , constraint_kwargs ):
135+ """
136+ Remove the index on the given list of field_names created by
137+ index/unique_together, depending on constraint_kwargs.
138+ """
139+ meta_constraint_names = {constraint .name for constraint in model ._meta .constraints }
140+ meta_index_names = {constraint .name for constraint in model ._meta .indexes }
141+ columns = [model ._meta .get_field (field ).column for field in field_names ]
142+ constraint_names = self ._constraint_names (
143+ model ,
144+ columns ,
145+ exclude = meta_constraint_names | meta_index_names ,
146+ ** constraint_kwargs ,
147+ )
148+ if len (constraint_names ) != 1 :
149+ num_found = len (constraint_names )
150+ columns_str = ", " .join (columns )
151+ raise ValueError (
152+ f"Found wrong number ({ num_found } ) of constraints for "
153+ f"{ model ._meta .db_table } ({ columns_str } )."
154+ )
155+ collection = self .connection .database [model ._meta .db_table ]
156+ collection .drop_index (constraint_names [0 ])
157+
127158 def add_constraint (self , model , constraint ):
128159 pass
129160
0 commit comments