diff --git a/mongoengine/document.py b/mongoengine/document.py index 36bf4017..e20500d6 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -161,7 +161,18 @@ class Document(BaseDocument): raise OperationError(message % unicode(err)) id_field = self._meta['id_field'] self[id_field] = self._fields[id_field].to_python(object_id) - self._changed_fields = [] + + def reset_changed_fields(doc): + """Loop through and reset changed fields lists""" + if hasattr(doc, '_changed_fields'): + doc._changed_fields = [] + + for field_name in doc._fields: + field = getattr(doc, field_name) + if hasattr(field, '_changed_fields') and field != doc: + reset_changed_fields(field) + + reset_changed_fields(self) signals.post_save.send(self.__class__, document=self, created=created) def delete(self, safe=False): diff --git a/tests/fields.py b/tests/fields.py index fe53d9e7..01280a15 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -879,7 +879,7 @@ class FieldTest(unittest.TestCase): name = StringField() children = ListField(EmbeddedDocumentField('self')) - Tree.drop_collection + Tree.drop_collection() tree = Tree(name="Tree") first_child = TreeNode(name="Child 1") @@ -887,9 +887,15 @@ class FieldTest(unittest.TestCase): second_child = TreeNode(name="Child 2") first_child.children.append(second_child) + tree.save() + + tree = Tree.objects.first() + self.assertEqual(len(tree.children), 1) + + self.assertEqual(len(tree.children[0].children), 1) third_child = TreeNode(name="Child 3") - first_child.children.append(third_child) + tree.children[0].children.append(third_child) tree.save() self.assertEqual(len(tree.children), 1)