From 646baddce45512e01367346a07195c6a30a613b3 Mon Sep 17 00:00:00 2001 From: emilecaron Date: Thu, 25 Jun 2015 18:27:22 +0000 Subject: [PATCH] fix cascade delete cycle issuue --- mongoengine/queryset/base.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 21d20dae..df628c35 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -346,7 +346,7 @@ class BaseQuerySet(object): return 0 return self._cursor.count(with_limit_and_skip=with_limit_and_skip) - def delete(self, write_concern=None, _from_doc_delete=False): + def delete(self, write_concern=None, _from_doc_delete=False, cascade_refs=None): """Delete the documents matched by the query. :param write_concern: Extra keyword arguments are passed down which @@ -363,6 +363,11 @@ class BaseQuerySet(object): 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 = {} @@ -405,7 +410,7 @@ class BaseQuerySet(object): ref_q = document_cls.objects(**{field_name + '__in': self}) ref_q_count = ref_q.count() if ref_q_count > 0: - ref_q.delete(write_concern=write_concern) + ref_q.delete(write_concern=write_concern, cascade_refs=cascade_refs) elif rule == NULLIFY: document_cls.objects(**{field_name + '__in': self}).update( write_concern=write_concern, **{'unset__%s' % field_name: 1})