Skip to content

Commit 3e22e60

Browse files
committed
implement SchemaEditor.alter_unique_together()
1 parent 88d194b commit 3e22e60

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
@@ -87,9 +87,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
8787
# AlterField (unique)
8888
"schema.tests.SchemaTests.test_indexes",
8989
"schema.tests.SchemaTests.test_unique",
90-
# alter_unique_together
91-
"migrations.test_operations.OperationTests.test_alter_unique_together",
92-
"schema.tests.SchemaTests.test_unique_together",
9390
}
9491
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
9592
_django_test_expected_failures_bitwise = {

django_mongodb/schema.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ def _create_model_indexes(self, model):
3535
index = Index(fields=field_names)
3636
index.set_name_with_model(model)
3737
self.add_index(model, index)
38+
# Meta.unique_together
39+
if model._meta.unique_together:
40+
self.alter_unique_together(model, [], model._meta.unique_together)
3841
# Meta.constraints
3942
for constraint in model._meta.constraints:
4043
self.add_constraint(model, constraint)
@@ -177,7 +180,25 @@ def alter_index_together(self, model, old_index_together, new_index_together):
177180
self.add_index(model, idx)
178181

179182
def alter_unique_together(self, model, old_unique_together, new_unique_together):
180-
pass
183+
def _get_name(field_names):
184+
return "{}_uniq{}".format("_".join(field_names), len(field_names))
185+
186+
olds = {tuple(fields) for fields in old_unique_together}
187+
news = {tuple(fields) for fields in new_unique_together}
188+
# Deleted uniques
189+
for field_names in olds.difference(news):
190+
constraint = UniqueConstraint(
191+
fields=field_names,
192+
name=_get_name(field_names),
193+
)
194+
self.remove_constraint(model, constraint)
195+
# Created uniques
196+
for field_names in news.difference(olds):
197+
constraint = UniqueConstraint(
198+
fields=field_names,
199+
name=_get_name(field_names),
200+
)
201+
self.add_constraint(model, constraint)
181202

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

0 commit comments

Comments
 (0)