diff --git a/AUTHORS b/AUTHORS index 29993c843..b0400f4d3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -226,4 +226,4 @@ that much better: * Emmanuel Leblond (https://github.com/touilleMan) * Breeze.Kay (https://github.com/9nix00) * Vicki Donchenko (https://github.com/kivistein) - + * Emile Caron (https://github.com/emilecaron) diff --git a/docs/changelog.rst b/docs/changelog.rst index d35551ce3..1fba7985e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -34,6 +34,7 @@ Changes in 0.10.0 - Allow dynamic lookup for more than two parts. #882 - Added support for min_distance on geo queries. #831 - Allow to add custom metadata to fields #705 +- Fix infinite recursion with CASCADE delete rules under specific conditions. #1046 Changes in 0.9.0 ================ diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index df628c35b..8db8351f0 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -363,11 +363,6 @@ def delete(self, write_concern=None, _from_doc_delete=False, cascade_refs=None): queryset = self.clone() doc = queryset._document - cascade_refs = set() if cascade_refs is None else cascade_refs - if doc in cascade_refs: - return 0 - cascade_refs.add(doc) - if write_concern is None: write_concern = {} @@ -407,7 +402,10 @@ def delete(self, write_concern=None, _from_doc_delete=False, cascade_refs=None): continue rule = doc._meta['delete_rules'][rule_entry] if rule == CASCADE: - ref_q = document_cls.objects(**{field_name + '__in': self}) + cascade_refs = set() if cascade_refs is None else cascade_refs + for ref in queryset: + cascade_refs.add(ref.id) + ref_q = document_cls.objects(**{field_name + '__in': self, 'id__nin': cascade_refs}) ref_q_count = ref_q.count() if ref_q_count > 0: ref_q.delete(write_concern=write_concern, cascade_refs=cascade_refs)