@@ -86,7 +86,14 @@ def remove_field(self, model, field):
86
86
self .connection .database [model ._meta .db_table ].update_many ({}, {"$unset" : {column : "" }})
87
87
88
88
def alter_index_together (self , model , old_index_together , new_index_together ):
89
- pass
89
+ olds = {tuple (fields ) for fields in old_index_together }
90
+ news = {tuple (fields ) for fields in new_index_together }
91
+ # Deleted indexes
92
+ for field_names in olds .difference (news ):
93
+ self ._remove_composed_index (model , field_names , {"index" : True , "unique" : False })
94
+ # Created indexes
95
+ for field_names in news .difference (olds ):
96
+ self ._add_composed_index (model , field_names )
90
97
91
98
def alter_unique_together (self , model , old_unique_together , new_unique_together ):
92
99
pass
@@ -125,6 +132,26 @@ def remove_index(self, model, index):
125
132
return
126
133
self .connection .database [model ._meta .db_table ].drop_index (index .name )
127
134
135
+ def _remove_composed_index (self , model , field_names , constraint_kwargs ):
136
+ meta_constraint_names = {constraint .name for constraint in model ._meta .constraints }
137
+ meta_index_names = {constraint .name for constraint in model ._meta .indexes }
138
+ columns = [model ._meta .get_field (field ).column for field in field_names ]
139
+ constraint_names = self ._constraint_names (
140
+ model ,
141
+ columns ,
142
+ exclude = meta_constraint_names | meta_index_names ,
143
+ ** constraint_kwargs ,
144
+ )
145
+ if len (constraint_names ) != 1 :
146
+ num_found = len (constraint_names )
147
+ columns_str = ", " .join (columns )
148
+ raise ValueError (
149
+ f"Found wrong number ({ num_found } ) of constraints for "
150
+ f"{ model ._meta .db_table } ({ columns_str } )."
151
+ )
152
+ collection = self .connection .database [model ._meta .db_table ]
153
+ collection .drop_index (constraint_names [0 ])
154
+
128
155
def add_constraint (self , model , constraint ):
129
156
pass
130
157
0 commit comments