@@ -30,7 +30,7 @@ def create_model(self, model):
30
30
def _create_model_indexes (self , model ):
31
31
"""
32
32
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.
34
34
"""
35
35
if not model ._meta .managed or model ._meta .proxy or model ._meta .swapped :
36
36
return
@@ -43,6 +43,9 @@ def _create_model_indexes(self, model):
43
43
# Meta.index_together (RemovedInDjango51Warning)
44
44
for field_names in model ._meta .index_together :
45
45
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 )
46
49
# Meta.constraints
47
50
for constraint in model ._meta .constraints :
48
51
self .add_constraint (model , constraint )
@@ -131,7 +134,21 @@ def alter_index_together(self, model, old_index_together, new_index_together):
131
134
self ._add_composed_index (model , field_names )
132
135
133
136
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 )
135
152
136
153
def add_index (self , model , index , field = None , unique = False ):
137
154
if index .contains_expressions :
0 commit comments