@@ -31,6 +31,9 @@ def _create_model_indexes(self, model):
3131 # Meta.index_together (RemovedInDjango51Warning)
3232 for field_names in model ._meta .index_together :
3333 self ._add_composed_index (model , field_names )
34+ # Meta.unique_together
35+ if model ._meta .unique_together :
36+ self .alter_unique_together (model , [], model ._meta .unique_together )
3437 # Meta.constraints
3538 for constraint in model ._meta .constraints :
3639 self .add_constraint (model , constraint )
@@ -123,7 +126,28 @@ def alter_index_together(self, model, old_index_together, new_index_together):
123126 self ._add_composed_index (model , field_names )
124127
125128 def alter_unique_together (self , model , old_unique_together , new_unique_together ):
126- pass
129+ olds = {tuple (fields ) for fields in old_unique_together }
130+ news = {tuple (fields ) for fields in new_unique_together }
131+ # Deleted uniques
132+ for field_names in olds .difference (news ):
133+ self ._remove_composed_index (
134+ model ,
135+ field_names ,
136+ {"unique" : True , "primary_key" : False },
137+ )
138+ # Created uniques
139+ for field_names in news .difference (olds ):
140+ fields = [model ._meta .get_field (field ) for field in field_names ]
141+ name = str (
142+ self ._unique_constraint_name (
143+ model ._meta .db_table , [field .column for field in fields ]
144+ )
145+ )
146+ constraint = UniqueConstraint (
147+ fields = field_names ,
148+ name = name ,
149+ )
150+ self .add_constraint (model , constraint )
127151
128152 def add_index (self , model , index , field = None , unique = False ):
129153 if index .contains_expressions :
0 commit comments