@@ -579,7 +579,6 @@ def _delta(self):
579579
580580 set_fields = self ._get_changed_fields ()
581581 unset_data = {}
582- parts = []
583582 if hasattr (self , '_changed_fields' ):
584583 set_data = {}
585584 # Fetch each set item from its path
@@ -589,15 +588,13 @@ def _delta(self):
589588 new_path = []
590589 for p in parts :
591590 if isinstance (d , (ObjectId , DBRef )):
591+ # Don't dig in the references
592592 break
593- elif isinstance (d , list ) and p .lstrip ('-' ).isdigit ():
594- if p [0 ] == '-' :
595- p = str (len (d ) + int (p ))
596- try :
597- d = d [int (p )]
598- except IndexError :
599- d = None
593+ elif isinstance (d , list ) and p .isdigit ():
594+ # An item of a list (identified by its index) is updated
595+ d = d [int (p )]
600596 elif hasattr (d , 'get' ):
597+ # dict-like (dict, embedded document)
601598 d = d .get (p )
602599 new_path .append (p )
603600 path = '.' .join (new_path )
@@ -609,26 +606,26 @@ def _delta(self):
609606
610607 # Determine if any changed items were actually unset.
611608 for path , value in set_data .items ():
612- if value or isinstance (value , (numbers .Number , bool )):
609+ if value or isinstance (value , (numbers .Number , bool )): # Account for 0 and True that are truthy
613610 continue
614611
615- # If we've set a value that ain't the default value don't unset it.
616- default = None
612+ parts = path . split ( '.' )
613+
617614 if (self ._dynamic and len (parts ) and parts [0 ] in
618615 self ._dynamic_fields ):
619616 del set_data [path ]
620617 unset_data [path ] = 1
621618 continue
622- elif path in self ._fields :
619+
620+ # If we've set a value that ain't the default value don't unset it.
621+ default = None
622+ if path in self ._fields :
623623 default = self ._fields [path ].default
624624 else : # Perform a full lookup for lists / embedded lookups
625625 d = self
626- parts = path .split ('.' )
627626 db_field_name = parts .pop ()
628627 for p in parts :
629- if isinstance (d , list ) and p .lstrip ('-' ).isdigit ():
630- if p [0 ] == '-' :
631- p = str (len (d ) + int (p ))
628+ if isinstance (d , list ) and p .isdigit ():
632629 d = d [int (p )]
633630 elif (hasattr (d , '__getattribute__' ) and
634631 not isinstance (d , dict )):
@@ -646,10 +643,9 @@ def _delta(self):
646643 default = None
647644
648645 if default is not None :
649- if callable (default ):
650- default = default ()
646+ default = default () if callable (default ) else default
651647
652- if default != value :
648+ if value != default :
653649 continue
654650
655651 del set_data [path ]
0 commit comments