@@ -86,6 +86,30 @@ def _alter_field(
86
86
new_db_params ,
87
87
strict = False ,
88
88
):
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 )} ) of unique "
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 )
89
113
# Removed an index? (no strict check, as multiple indexes are possible)
90
114
# Remove indexes if db_index switched to False or a unique constraint
91
115
# will now be used in lieu of an index. The following lines from the
@@ -122,6 +146,25 @@ def _alter_field(
122
146
self .connection .database [model ._meta .db_table ].update_many (
123
147
{}, {"$rename" : {old_field .column : new_field .column }}
124
148
)
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 } _key"
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 } _key"
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 } _key"
166
+ )
167
+ self .add_constraint (model , constraint )
125
168
# Added an index? Add an index if db_index switched to True or a unique
126
169
# constraint will no longer be used in lieu of an index. The following
127
170
# lines from the truth table show all True cases; the rest are False:
0 commit comments