Skip to content

Commit ad9e91e

Browse files
committed
add helpers to add/delete unique
1 parent 096096a commit ad9e91e

File tree

1 file changed

+30
-40
lines changed

1 file changed

+30
-40
lines changed

django_mongodb/schema.py

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ def _create_model_indexes(self, model):
2626
# Field uniques
2727
for field in model._meta.local_fields:
2828
if field.unique and field.column != "_id":
29-
constraint = UniqueConstraint(
30-
fields=[field.name], name=f"{model._meta.db_table}_{field.column}_key"
31-
)
32-
self.add_constraint(model, constraint)
29+
self._add_unique_for_field(model, field)
3330
# Meta.index_together (RemovedInDjango51Warning)
3431
for field_names in model._meta.index_together:
3532
index = Index(fields=field_names)
@@ -66,10 +63,7 @@ def add_field(self, model, field):
6663
if self._field_should_be_indexed(model, field):
6764
self._add_index_for_field(model, field)
6865
if field.unique and field.column != "_id":
69-
constraint = UniqueConstraint(
70-
fields=[field.name], name=f"{model._meta.db_table}_{field.column}_key"
71-
)
72-
self.add_constraint(model, constraint, field=field)
66+
self._add_unique_for_field(model, field)
7367

7468
def _add_index_for_field(self, model, field):
7569
new_index = Index(fields=[field.name])
@@ -97,6 +91,30 @@ def _drop_index_for_field(self, model, field):
9791
# is to look at its name (refs #28053).
9892
collection.drop_index(index_name)
9993

94+
def _add_unique_for_field(self, model, field):
95+
constraint = UniqueConstraint(
96+
fields=[field.name], name=f"{model._meta.db_table}_{field.column}_key"
97+
)
98+
self.add_constraint(model, constraint, field=field)
99+
100+
def _drop_unique_for_field(self, model, field, strict):
101+
# Find the unique constraint for this field
102+
meta_constraint_names = {constraint.name for constraint in model._meta.constraints}
103+
constraint_names = self._constraint_names(
104+
model,
105+
[field.column],
106+
unique=True,
107+
primary_key=False,
108+
exclude=meta_constraint_names,
109+
)
110+
if strict and len(constraint_names) != 1:
111+
raise ValueError(
112+
f"Found wrong number ({len(constraint_names)}) of unique "
113+
f"constraints for {model._meta.db_table}.{field.column}"
114+
)
115+
for constraint_name in constraint_names:
116+
self.connection.database[model._meta.db_table].drop_index(constraint_name)
117+
100118
def _alter_field(
101119
self,
102120
model,
@@ -113,26 +131,7 @@ def _alter_field(
113131
if old_field.unique and (
114132
not new_field.unique or self._field_became_primary_key(old_field, new_field)
115133
):
116-
# Find the unique constraint for this field
117-
meta_constraint_names = {constraint.name for constraint in model._meta.constraints}
118-
constraint_names = self._constraint_names(
119-
model,
120-
[old_field.column],
121-
unique=True,
122-
primary_key=False,
123-
exclude=meta_constraint_names,
124-
)
125-
if strict and len(constraint_names) != 1:
126-
raise ValueError(
127-
f"Found wrong number ({len(constraint_names)}) of unique "
128-
f"constraints for {model._meta.db_table}.{old_field.column}"
129-
)
130-
for constraint_name in constraint_names:
131-
constraint = UniqueConstraint(
132-
fields=[old_field.name],
133-
name=constraint_name,
134-
)
135-
self.remove_constraint(model, constraint)
134+
self._drop_unique_for_field(model, old_field, strict)
136135
# Removed an index? (no strict check, as multiple indexes are possible)
137136
# Remove indexes if db_index switched to False or a unique constraint
138137
# will now be used in lieu of an index. The following lines from the
@@ -161,14 +160,8 @@ def _alter_field(
161160
# Move unique to the new field, if needed.
162161
if old_field.unique and new_field.unique and new_field.column != "_id":
163162
if not old_field.primary_key:
164-
old_constraint = UniqueConstraint(
165-
fields=[old_field.name], name=f"{model._meta.db_table}_{old_field.column}_key"
166-
)
167-
self.remove_constraint(model, old_constraint)
168-
new_constraint = UniqueConstraint(
169-
fields=[new_field.name], name=f"{model._meta.db_table}_{new_field.column}_key"
170-
)
171-
self.add_constraint(model, new_constraint, field=new_field)
163+
self._drop_unique_for_field(model, old_field, strict)
164+
self._add_unique_for_field(model, new_field)
172165
# Replace NULL with the field default if the field and was changed from
173166
# NULL to NOT NULL.
174167
if new_field.has_default() and old_field.null and not new_field.null:
@@ -177,10 +170,7 @@ def _alter_field(
177170
collection.update_many({column: {"$eq": None}}, [{"$set": {column: default}}])
178171
# Added a unique?
179172
if self._unique_should_be_added(old_field, new_field):
180-
constraint = UniqueConstraint(
181-
fields=[new_field.name], name=f"{model._meta.db_table}_{new_field.column}_key"
182-
)
183-
self.add_constraint(model, constraint, field=new_field)
173+
self._add_unique_for_field(model, new_field)
184174
# Added an index? Add an index if db_index switched to True or a unique
185175
# constraint will no longer be used in lieu of an index. The following
186176
# lines from the truth table show all True cases; the rest are False:

0 commit comments

Comments
 (0)