Skip to content

Commit 14b79a3

Browse files
committed
implement SchemaEditor.alter_unique_together()
1 parent fbdd36f commit 14b79a3

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

django_mongodb/features.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
110110
# AlterField (unique)
111111
"schema.tests.SchemaTests.test_unique",
112112
"schema.tests.SchemaTests.test_unique_and_reverse_m2m",
113-
# alter_unique_together
114-
"schema.tests.SchemaTests.test_unique_together",
115113
# ManyToManyField
116114
"schema.tests.SchemaTests.test_m2m_rename_field_in_target_model",
117115
"schema.tests.SchemaTests.test_m2m_repoint",

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)
@@ -87,7 +90,25 @@ def alter_index_together(self, model, old_index_together, new_index_together):
8790
self.add_index(model, idx)
8891

8992
def alter_unique_together(self, model, old_unique_together, new_unique_together):
90-
pass
93+
def _get_name(field_names):
94+
return "{}_uniq{}".format("_".join(field_names), len(field_names))
95+
96+
olds = {tuple(fields) for fields in old_unique_together}
97+
news = {tuple(fields) for fields in new_unique_together}
98+
# Deleted uniques
99+
for field_names in olds.difference(news):
100+
constraint = UniqueConstraint(
101+
fields=field_names,
102+
name=_get_name(field_names),
103+
)
104+
self.remove_constraint(model, constraint)
105+
# Created uniques
106+
for field_names in news.difference(olds):
107+
constraint = UniqueConstraint(
108+
fields=field_names,
109+
name=_get_name(field_names),
110+
)
111+
self.add_constraint(model, constraint)
91112

92113
def add_index(self, model, index, unique=False):
93114
if index.contains_expressions:

0 commit comments

Comments
 (0)