diff --git a/docs/changelog.rst b/docs/changelog.rst index 2ada58e7..b3925e75 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.6.15 ================= +- Fixed cascade save edge case - Fixed geo index creation through reference fields - Added support for args / kwargs when using @queryset_manager - Deref list custom id fix diff --git a/mongoengine/document.py b/mongoengine/document.py index c36645f8..27792780 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -248,11 +248,16 @@ class Document(BaseDocument): _refs = kwargs.get('_refs', []) or [] for name, cls in self._fields.items(): + if not isinstance(cls, (ReferenceField, GenericReferenceField)): continue + ref = getattr(self, name) if not ref: continue + if isinstance(ref, DBRef): + continue + ref_id = "%s,%s" % (ref.__class__.__name__, str(ref._data)) if ref and ref_id not in _refs: _refs.append(ref_id) diff --git a/tests/test_document.py b/tests/test_document.py index 30d92447..992c2832 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -3186,5 +3186,29 @@ name: Field is required ("name")""" p = Person(age=15) self.assertRaises(ValidationError, p.validate) + def test_cascaded_save_wrong_reference(self): + + class ADocument(Document): + val = IntField() + + class BDocument(Document): + a = ReferenceField(ADocument) + + ADocument.drop_collection() + BDocument.drop_collection() + + a = ADocument() + a.val = 15 + a.save() + + b = BDocument() + b.a = a + b.save() + + a.delete() + + b = BDocument.objects.first() + b.save(cascade=True) + if __name__ == '__main__': unittest.main()