Skip to content

Commit 70902b2

Browse files
committed
add support for Meta.unique_together
1 parent 9fe7f04 commit 70902b2

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

django_mongodb/features.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,6 @@ class DatabaseFeatures(BaseDatabaseFeatures):
7878
# AlterField (unique)
7979
"schema.tests.SchemaTests.test_indexes",
8080
"schema.tests.SchemaTests.test_unique",
81-
# alter_unique_together
82-
"migrations.test_operations.OperationTests.test_alter_unique_together",
83-
"schema.tests.SchemaTests.test_unique_together",
8481
}
8582
# $bitAnd, #bitOr, and $bitXor are new in MongoDB 6.3.
8683
_django_test_expected_failures_bitwise = {

django_mongodb/schema.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def create_model(self, model):
3030
def _create_model_indexes(self, model):
3131
"""
3232
Create all indexes (field indexes & uniques, Meta.index_together,
33-
Meta.constraints, Meta.indexes) for the specified model.
33+
Meta.unique_together, Meta.constraints, Meta.indexes) for the specified
34+
model.
3435
"""
3536
if not model._meta.managed or model._meta.proxy or model._meta.swapped:
3637
return
@@ -43,6 +44,9 @@ def _create_model_indexes(self, model):
4344
# Meta.index_together (RemovedInDjango51Warning)
4445
for field_names in model._meta.index_together:
4546
self._add_composed_index(model, field_names)
47+
# Meta.unique_together
48+
if model._meta.unique_together:
49+
self.alter_unique_together(model, [], model._meta.unique_together)
4650
# Meta.constraints
4751
for constraint in model._meta.constraints:
4852
self.add_constraint(model, constraint)
@@ -131,7 +135,28 @@ def alter_index_together(self, model, old_index_together, new_index_together):
131135
self._add_composed_index(model, field_names)
132136

133137
def alter_unique_together(self, model, old_unique_together, new_unique_together):
134-
pass
138+
olds = {tuple(fields) for fields in old_unique_together}
139+
news = {tuple(fields) for fields in new_unique_together}
140+
# Deleted uniques
141+
for field_names in olds.difference(news):
142+
self._remove_composed_index(
143+
model,
144+
field_names,
145+
{"unique": True, "primary_key": False},
146+
)
147+
# Created uniques
148+
for field_names in news.difference(olds):
149+
fields = [model._meta.get_field(field) for field in field_names]
150+
name = str(
151+
self._unique_constraint_name(
152+
model._meta.db_table, [field.column for field in fields]
153+
)
154+
)
155+
constraint = UniqueConstraint(
156+
fields=field_names,
157+
name=name,
158+
)
159+
self.add_constraint(model, constraint)
135160

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

0 commit comments

Comments
 (0)