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            # Indexing on $type matches the value of most SQL databases by 
172177            # allowing multiple null values for the unique constraint. 
173178            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 )}) 
175180            else :
176181                for  field_name , _  in  index .fields_orders :
177182                    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 
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+                 name = constraint .name ,
274+                 condition = constraint .condition ,
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+                 name = constraint .name ,
294+                 condition = constraint .condition ,
295+             )
280296            self .remove_index (model , idx )
281297
282298    def  _remove_field_unique (self , model , field ):
0 commit comments