Skip to content

Commit aa19941

Browse files
committed
implement SchemaEditor.alter_unique_together()
1 parent 5a421fc commit aa19941

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

django_mongodb/features.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
8585
# AlterField (unique)
8686
"schema.tests.SchemaTests.test_indexes",
8787
"schema.tests.SchemaTests.test_unique",
88-
# alter_unique_together
89-
"migrations.test_operations.OperationTests.test_alter_unique_together",
90-
"schema.tests.SchemaTests.test_unique_together",
9188
}
9289
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
9390
_django_test_expected_failures_bitwise = {

django_mongodb/schema.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ def _create_model_indexes(self, model):
3131
# Meta.index_together (RemovedInDjango51Warning)
3232
for field_names in model._meta.index_together:
3333
self._add_composed_index(model, field_names)
34+
# Meta.unique_together
35+
if model._meta.unique_together:
36+
self.alter_unique_together(model, [], model._meta.unique_together)
3437
# Meta.constraints
3538
for constraint in model._meta.constraints:
3639
self.add_constraint(model, constraint)
@@ -123,7 +126,28 @@ def alter_index_together(self, model, old_index_together, new_index_together):
123126
self._add_composed_index(model, field_names)
124127

125128
def alter_unique_together(self, model, old_unique_together, new_unique_together):
126-
pass
129+
olds = {tuple(fields) for fields in old_unique_together}
130+
news = {tuple(fields) for fields in new_unique_together}
131+
# Deleted uniques
132+
for field_names in olds.difference(news):
133+
self._remove_composed_index(
134+
model,
135+
field_names,
136+
{"unique": True, "primary_key": False},
137+
)
138+
# Created uniques
139+
for field_names in news.difference(olds):
140+
fields = [model._meta.get_field(field) for field in field_names]
141+
name = str(
142+
self._unique_constraint_name(
143+
model._meta.db_table, [field.column for field in fields]
144+
)
145+
)
146+
constraint = UniqueConstraint(
147+
fields=field_names,
148+
name=name,
149+
)
150+
self.add_constraint(model, constraint)
127151

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

0 commit comments

Comments
 (0)