@@ -31,6 +31,9 @@ def _create_model_indexes(self, model):
31
31
# Meta.index_together (RemovedInDjango51Warning)
32
32
for field_names in model ._meta .index_together :
33
33
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 )
34
37
# Meta.constraints
35
38
for constraint in model ._meta .constraints :
36
39
self .add_constraint (model , constraint )
@@ -123,7 +126,28 @@ def alter_index_together(self, model, old_index_together, new_index_together):
123
126
self ._add_composed_index (model , field_names )
124
127
125
128
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 )
127
151
128
152
def add_index (self , model , index , field = None , unique = False ):
129
153
if index .contains_expressions :
0 commit comments