1
+ from collections import defaultdict
2
+
1
3
from django .db .backends .base .schema import BaseDatabaseSchemaEditor
2
4
from django .db .models import Index , UniqueConstraint
3
5
from pymongo import ASCENDING , DESCENDING
@@ -166,17 +168,23 @@ def add_index(self, model, index, field=None, unique=False):
166
168
if index .contains_expressions :
167
169
return
168
170
kwargs = {}
171
+ filter_expression = defaultdict (dict )
172
+ if index .condition :
173
+ filter_expression .update (index ._get_condition_mql (model , self ))
169
174
if unique :
170
- filter_expression = {}
175
+ kwargs [ "unique" ] = True
171
176
# Indexing on $type matches the value of most SQL databases by
172
177
# allowing multiple null values for the unique constraint.
173
178
if field :
174
- filter_expression [field .column ] = {"$type" : field .db_type (self .connection )}
179
+ filter_expression [field .column ]. update ( {"$type" : field .db_type (self .connection )})
175
180
else :
176
181
for field_name , _ in index .fields_orders :
177
182
field_ = model ._meta .get_field (field_name )
178
- filter_expression [field_ .column ] = {"$type" : field_ .db_type (self .connection )}
179
- kwargs = {"partialFilterExpression" : filter_expression , "unique" : True }
183
+ filter_expression [field_ .column ].update (
184
+ {"$type" : field_ .db_type (self .connection )}
185
+ )
186
+ if filter_expression :
187
+ kwargs ["partialFilterExpression" ] = filter_expression
180
188
index_orders = (
181
189
[(field .column , ASCENDING )]
182
190
if field
@@ -260,7 +268,11 @@ def add_constraint(self, model, constraint, field=None):
260
268
expressions = constraint .expressions ,
261
269
nulls_distinct = constraint .nulls_distinct ,
262
270
):
263
- idx = Index (fields = constraint .fields , name = constraint .name )
271
+ idx = Index (
272
+ fields = constraint .fields ,
273
+ name = constraint .name ,
274
+ condition = constraint .condition ,
275
+ )
264
276
self .add_index (model , idx , field = field , unique = True )
265
277
266
278
def _add_field_unique (self , model , field ):
@@ -276,7 +288,11 @@ def remove_constraint(self, model, constraint):
276
288
expressions = constraint .expressions ,
277
289
nulls_distinct = constraint .nulls_distinct ,
278
290
):
279
- idx = Index (fields = constraint .fields , name = constraint .name )
291
+ idx = Index (
292
+ fields = constraint .fields ,
293
+ name = constraint .name ,
294
+ condition = constraint .condition ,
295
+ )
280
296
self .remove_index (model , idx )
281
297
282
298
def _remove_field_unique (self , model , field ):
0 commit comments