@@ -86,6 +86,30 @@ def _alter_field(
8686        new_db_params ,
8787        strict = False ,
8888    ):
89+         # Has unique been removed? 
90+         if  old_field .unique  and  (
91+             not  new_field .unique  or  self ._field_became_primary_key (old_field , new_field )
92+         ):
93+             # Find the unique constraint for this field 
94+             meta_constraint_names  =  {constraint .name  for  constraint  in  model ._meta .constraints }
95+             constraint_names  =  self ._constraint_names (
96+                 model ,
97+                 [old_field .column ],
98+                 unique = True ,
99+                 primary_key = False ,
100+                 exclude = meta_constraint_names ,
101+             )
102+             if  strict  and  len (constraint_names ) !=  1 :
103+                 raise  ValueError (
104+                     f"Found wrong number ({ len (constraint_names )}  
105+                     f"constraints for { model ._meta .db_table } { old_field .column }  
106+                 )
107+             for  constraint_name  in  constraint_names :
108+                 constraint  =  UniqueConstraint (
109+                     fields = [old_field .name ],
110+                     name = constraint_name ,
111+                 )
112+                 self .remove_constraint (model , constraint )
89113        # Removed an index? (no strict check, as multiple indexes are possible) 
90114        # Remove indexes if db_index switched to False or a unique constraint 
91115        # will now be used in lieu of an index. The following lines from the 
@@ -122,6 +146,25 @@ def _alter_field(
122146            self .connection .database [model ._meta .db_table ].update_many (
123147                {}, {"$rename" : {old_field .column : new_field .column }}
124148            )
149+             # Rename index 
150+             if  old_field .db_index  and  new_field .db_index :
151+                 pass 
152+             # Rename unique 
153+             if  old_field .unique  and  new_field .unique :
154+                 old_constraint  =  UniqueConstraint (
155+                     fields = [old_field .name ], name = f"{ model ._meta .db_table } { old_field .column }  
156+                 )
157+                 self .add_constraint (model , old_constraint )
158+                 new_constraint  =  UniqueConstraint (
159+                     fields = [new_field .name ], name = f"{ model ._meta .db_table } { new_field .column }  
160+                 )
161+                 self .add_constraint (model , new_constraint , field = new_field )
162+         # Added a unique? 
163+         if  self ._unique_should_be_added (old_field , new_field ):
164+             constraint  =  UniqueConstraint (
165+                 fields = [new_field .name ], name = f"{ model ._meta .db_table } { new_field .column }  
166+             )
167+             self .add_constraint (model , constraint )
125168        # Added an index? Add an index if db_index switched to True or a unique 
126169        # constraint will no longer be used in lieu of an index. The following 
127170        # lines from the truth table show all True cases; the rest are False: 
0 commit comments