fix cascade delete cycle issuue

This commit is contained in:
emilecaron 2015-06-25 18:27:22 +00:00
parent 02f61c323d
commit 646baddce4

View File

@ -346,7 +346,7 @@ class BaseQuerySet(object):
return 0 return 0
return self._cursor.count(with_limit_and_skip=with_limit_and_skip) 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. """Delete the documents matched by the query.
:param write_concern: Extra keyword arguments are passed down which :param write_concern: Extra keyword arguments are passed down which
@ -363,6 +363,11 @@ class BaseQuerySet(object):
queryset = self.clone() queryset = self.clone()
doc = queryset._document 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: if write_concern is None:
write_concern = {} write_concern = {}
@ -405,7 +410,7 @@ class BaseQuerySet(object):
ref_q = document_cls.objects(**{field_name + '__in': self}) ref_q = document_cls.objects(**{field_name + '__in': self})
ref_q_count = ref_q.count() ref_q_count = ref_q.count()
if ref_q_count > 0: 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: elif rule == NULLIFY:
document_cls.objects(**{field_name + '__in': self}).update( document_cls.objects(**{field_name + '__in': self}).update(
write_concern=write_concern, **{'unset__%s' % field_name: 1}) write_concern=write_concern, **{'unset__%s' % field_name: 1})