@@ -95,7 +95,14 @@ def remove_field(self, model, field):
95
95
self ._remove_field_index (model , field )
96
96
97
97
def alter_index_together (self , model , old_index_together , new_index_together ):
98
- pass
98
+ olds = {tuple (fields ) for fields in old_index_together }
99
+ news = {tuple (fields ) for fields in new_index_together }
100
+ # Deleted indexes
101
+ for field_names in olds .difference (news ):
102
+ self ._remove_composed_index (model , field_names , {"index" : True , "unique" : False })
103
+ # Created indexes
104
+ for field_names in news .difference (olds ):
105
+ self ._add_composed_index (model , field_names )
99
106
100
107
def alter_unique_together (self , model , old_unique_together , new_unique_together ):
101
108
pass
@@ -133,6 +140,30 @@ def remove_index(self, model, index):
133
140
return
134
141
self .get_collection (model ._meta .db_table ).drop_index (index .name )
135
142
143
+ def _remove_composed_index (self , model , field_names , constraint_kwargs ):
144
+ """
145
+ Remove the index on the given list of field_names created by
146
+ index/unique_together, depending on constraint_kwargs.
147
+ """
148
+ meta_constraint_names = {constraint .name for constraint in model ._meta .constraints }
149
+ meta_index_names = {constraint .name for constraint in model ._meta .indexes }
150
+ columns = [model ._meta .get_field (field ).column for field in field_names ]
151
+ constraint_names = self ._constraint_names (
152
+ model ,
153
+ columns ,
154
+ exclude = meta_constraint_names | meta_index_names ,
155
+ ** constraint_kwargs ,
156
+ )
157
+ if len (constraint_names ) != 1 :
158
+ num_found = len (constraint_names )
159
+ columns_str = ", " .join (columns )
160
+ raise ValueError (
161
+ f"Found wrong number ({ num_found } ) of constraints for "
162
+ f"{ model ._meta .db_table } ({ columns_str } )."
163
+ )
164
+ collection = self .get_collection (model ._meta .db_table )
165
+ collection .drop_index (constraint_names [0 ])
166
+
136
167
def _remove_field_index (self , model , field ):
137
168
"""Remove a field's db_index=True index."""
138
169
collection = self .get_collection (model ._meta .db_table )
0 commit comments