1+ from collections import defaultdict
2+
13from django .db .backends .base .schema import BaseDatabaseSchemaEditor
24from django .db .models import Index , UniqueConstraint
35from pymongo import ASCENDING , DESCENDING
@@ -166,17 +168,23 @@ def add_index(self, model, index, field=None, unique=False):
166168 if index .contains_expressions :
167169 return
168170 kwargs = {}
171+ filter_expression = defaultdict (dict )
172+ if index .condition :
173+ filter_expression .update (index ._get_condition_mql (model , self ))
169174 if unique :
170- filter_expression = {}
175+ kwargs [ "unique" ] = True
171176 if field :
172- filter_expression [field .column ] = {"$type" : field .db_type (self .connection )}
177+ filter_expression [field .column ]. update ( {"$type" : field .db_type (self .connection )})
173178 else :
174179 for field_name , _ in index .fields_orders :
175180 field_ = model ._meta .get_field (field_name )
176- filter_expression [field_ .column ] = {"$type" : field_ .db_type (self .connection )}
181+ filter_expression [field_ .column ].update (
182+ {"$type" : field_ .db_type (self .connection )}
183+ )
177184 # Use partialFilterExpression to allow multiple null values for a
178185 # unique constraint.
179- kwargs = {"partialFilterExpression" : filter_expression , "unique" : True }
186+ if filter_expression :
187+ kwargs ["partialFilterExpression" ] = filter_expression
180188 index_orders = (
181189 [(field .column , ASCENDING )]
182190 if field
@@ -260,7 +268,11 @@ def add_constraint(self, model, constraint, field=None):
260268 expressions = constraint .expressions ,
261269 nulls_distinct = constraint .nulls_distinct ,
262270 ):
263- idx = Index (fields = constraint .fields , name = constraint .name )
271+ idx = Index (
272+ fields = constraint .fields ,
273+ condition = constraint .condition ,
274+ name = constraint .name ,
275+ )
264276 self .add_index (model , idx , field = field , unique = True )
265277
266278 def _add_field_unique (self , model , field ):
@@ -276,7 +288,11 @@ def remove_constraint(self, model, constraint):
276288 expressions = constraint .expressions ,
277289 nulls_distinct = constraint .nulls_distinct ,
278290 ):
279- idx = Index (fields = constraint .fields , name = constraint .name )
291+ idx = Index (
292+ fields = constraint .fields ,
293+ condition = constraint .condition ,
294+ name = constraint .name ,
295+ )
280296 self .remove_index (model , idx )
281297
282298 def _remove_field_unique (self , model , field ):
0 commit comments