@@ -30,7 +30,7 @@ def create_model(self, model):
3030 def _create_model_indexes (self , model ):
3131 """
3232 Create all indexes (field indexes & uniques, Meta.index_together,
33- Meta.constraints, Meta.indexes) for the specified model.
33+ Meta.unique_together, Meta. constraints, Meta.indexes) for the model.
3434 """
3535 if not model ._meta .managed or model ._meta .proxy or model ._meta .swapped :
3636 return
@@ -43,6 +43,9 @@ def _create_model_indexes(self, model):
4343 # Meta.index_together (RemovedInDjango51Warning)
4444 for field_names in model ._meta .index_together :
4545 self ._add_composed_index (model , field_names )
46+ # Meta.unique_together
47+ if model ._meta .unique_together :
48+ self .alter_unique_together (model , [], model ._meta .unique_together )
4649 # Meta.constraints
4750 for constraint in model ._meta .constraints :
4851 self .add_constraint (model , constraint )
@@ -131,7 +134,21 @@ def alter_index_together(self, model, old_index_together, new_index_together):
131134 self ._add_composed_index (model , field_names )
132135
133136 def alter_unique_together (self , model , old_unique_together , new_unique_together ):
134- pass
137+ olds = {tuple (fields ) for fields in old_unique_together }
138+ news = {tuple (fields ) for fields in new_unique_together }
139+ # Deleted uniques
140+ for field_names in olds .difference (news ):
141+ self ._remove_composed_index (
142+ model ,
143+ field_names ,
144+ {"unique" : True , "primary_key" : False },
145+ )
146+ # Created uniques
147+ for field_names in news .difference (olds ):
148+ columns = [model ._meta .get_field (field ).column for field in field_names ]
149+ name = str (self ._unique_constraint_name (model ._meta .db_table , columns ))
150+ constraint = UniqueConstraint (fields = field_names , name = name )
151+ self .add_constraint (model , constraint )
135152
136153 def add_index (self , model , index , field = None , unique = False ):
137154 if index .contains_expressions :
0 commit comments