fix mark_as_changed: handle higher/lower level changed fields correctly to avoid conflict update error

This commit is contained in:
Catstyle
2015-04-10 11:31:31 +08:00
parent 8fea2b09be
commit 175659628d
4 changed files with 65 additions and 1 deletions

View File

@@ -483,7 +483,19 @@ class BaseDocument(object):
key = self._db_field_map.get(key, key)
if key not in self._changed_fields:
self._changed_fields.append(key)
levels, idx = key.split('.'), 1
while idx <= len(levels):
if '.'.join(levels[:idx]) in self._changed_fields:
break
idx += 1
else:
self._changed_fields.append(key)
# remove lower level changed fields
level = '.'.join(levels[:idx]) + '.'
remove = self._changed_fields.remove
for field in self._changed_fields:
if field.startswith(level):
remove(field)
def _clear_changed_fields(self):
"""Using get_changed_fields iterate and remove any fields that are