Skip to content

Commit 470a014

Browse files
committed
implement SchemaEditor.alter_unique_together()
1 parent 5b5766c commit 470a014

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

django_mongodb/features.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
9999
# AlterField (unique)
100100
"schema.tests.SchemaTests.test_indexes",
101101
"schema.tests.SchemaTests.test_unique",
102-
# alter_unique_together
103-
"migrations.test_operations.OperationTests.test_alter_unique_together",
104-
"schema.tests.SchemaTests.test_unique_together",
105102
}
106103
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
107104
_django_test_expected_failures_bitwise = {

django_mongodb/schema.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ def _create_model_indexes(self, model):
3737
index = Index(fields=field_names)
3838
index.set_name_with_model(model)
3939
self.add_index(model, index)
40+
# Meta.unique_together
41+
if model._meta.unique_together:
42+
self.alter_unique_together(model, [], model._meta.unique_together)
4043
# Meta.constraints
4144
for constraint in model._meta.constraints:
4245
self.add_constraint(model, constraint)
@@ -161,7 +164,25 @@ def alter_index_together(self, model, old_index_together, new_index_together):
161164
self.add_index(model, idx)
162165

163166
def alter_unique_together(self, model, old_unique_together, new_unique_together):
164-
pass
167+
def _get_name(field_names):
168+
return "{}_uniq{}".format("_".join(field_names), len(field_names))
169+
170+
olds = {tuple(fields) for fields in old_unique_together}
171+
news = {tuple(fields) for fields in new_unique_together}
172+
# Deleted uniques
173+
for field_names in olds.difference(news):
174+
constraint = UniqueConstraint(
175+
fields=field_names,
176+
name=_get_name(field_names),
177+
)
178+
self.remove_constraint(model, constraint)
179+
# Created uniques
180+
for field_names in news.difference(olds):
181+
constraint = UniqueConstraint(
182+
fields=field_names,
183+
name=_get_name(field_names),
184+
)
185+
self.add_constraint(model, constraint)
165186

166187
def add_index(self, model, index, field=None, unique=False):
167188
if index.contains_expressions:

0 commit comments

Comments
 (0)