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})