1
1
from django .db .backends .base .schema import BaseDatabaseSchemaEditor
2
- from django .db .models import Index
2
+ from django .db .models import Index , UniqueConstraint
3
3
from pymongo .operations import IndexModel
4
4
5
5
@@ -14,8 +14,8 @@ def create_model(self, model):
14
14
15
15
def _create_model_indexes (self , model ):
16
16
"""
17
- Create all indexes (field indexes, index_together, Meta.indexes) for
18
- the specified model.
17
+ Create all indexes (field indexes & uniques , index_together,
18
+ Meta.constraints, Meta.indexes) for the specified model.
19
19
"""
20
20
if not model ._meta .managed or model ._meta .proxy or model ._meta .swapped :
21
21
return
@@ -25,11 +25,19 @@ def _create_model_indexes(self, model):
25
25
index = Index (fields = [field .name ])
26
26
index .set_name_with_model (model )
27
27
self .add_index (model , index )
28
+ # Field uniques
29
+ for field in model ._meta .local_fields :
30
+ if field .unique and field .column != "_id" :
31
+ constraint = UniqueConstraint (fields = [field .name ], name = "%s_uniq" % field .column )
32
+ self .add_constraint (model , constraint )
28
33
# Meta.index_together (RemovedInDjango51Warning)
29
34
for field_names in model ._meta .index_together :
30
35
index = Index (fields = field_names )
31
36
index .set_name_with_model (model )
32
37
self .add_index (model , index )
38
+ # Meta.constraints
39
+ for constraint in model ._meta .constraints :
40
+ self .add_constraint (model , constraint )
33
41
# Meta.indexes
34
42
for index in model ._meta .indexes :
35
43
self .add_index (model , index )
@@ -95,7 +103,7 @@ def alter_index_together(self, model, old_index_together, new_index_together):
95
103
def alter_unique_together (self , model , old_unique_together , new_unique_together ):
96
104
pass
97
105
98
- def add_index (self , model , index ):
106
+ def add_index (self , model , index , unique = False ):
99
107
if index .contains_expressions :
100
108
return
101
109
idx = IndexModel (
@@ -104,6 +112,7 @@ def add_index(self, model, index):
104
112
for field_name , order in index .fields_orders
105
113
],
106
114
name = index .name ,
115
+ unique = unique ,
107
116
)
108
117
self .connection .database [model ._meta .db_table ].create_indexes ([idx ])
109
118
@@ -113,10 +122,18 @@ def remove_index(self, model, index):
113
122
self .connection .database [model ._meta .db_table ].drop_index (index .name )
114
123
115
124
def add_constraint (self , model , constraint ):
116
- pass
125
+ if constraint .expressions :
126
+ return
127
+ if isinstance (constraint , UniqueConstraint ):
128
+ idx = Index (fields = constraint .fields , name = constraint .name )
129
+ self .add_index (model , idx , unique = True )
117
130
118
131
def remove_constraint (self , model , constraint ):
119
- pass
132
+ if constraint .expressions :
133
+ return
134
+ if isinstance (constraint , UniqueConstraint ):
135
+ idx = Index (fields = constraint .fields , name = constraint .name )
136
+ self .remove_index (model , idx )
120
137
121
138
def alter_db_table (self , model , old_db_table , new_db_table ):
122
139
self .connection .database [old_db_table ].rename (new_db_table )
0 commit comments