diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 2b5c93d5..ce1af2d5 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -405,6 +405,7 @@ class BaseQuerySet(object): will force an fsync on the primary server. :param _from_doc_delete: True when called from document delete therefore signals will have been triggered so don't loop. + :returns number of deleted documents """ queryset = self.clone() doc = queryset._document @@ -422,9 +423,11 @@ class BaseQuerySet(object): has_delete_signal) and not _from_doc_delete if call_document_delete: + cnt = 0 for doc in queryset: doc.delete(write_concern=write_concern) - return + cnt += 1 + return cnt delete_rules = doc._meta.get('delete_rules') or {} # Check for DENY rules before actually deleting/nullifying any other @@ -455,8 +458,8 @@ class BaseQuerySet(object): write_concern=write_concern, **{'pull_all__%s' % field_name: self}) - queryset._collection.remove( - queryset._query, write_concern=write_concern) + result = queryset._collection.remove(queryset._query, write_concern=write_concern) + return result["n"] def update(self, upsert=False, multi=True, write_concern=None, full_result=False, **update): diff --git a/tests/queryset/queryset.py b/tests/queryset/queryset.py index 0eadd7ed..fc56df7d 100644 --- a/tests/queryset/queryset.py +++ b/tests/queryset/queryset.py @@ -4390,6 +4390,17 @@ class QuerySetTest(unittest.TestCase): {'_id': None, 'avg': 29, 'total': 2} ]) + def test_delete_count(self): + [self.Person(name="User {0}".format(i), age=i * 10).save() for i in xrange(1, 4)] + self.assertEqual(self.Person.objects().delete(), 3) # test ordinary QuerySey delete count + + [self.Person(name="User {0}".format(i), age=i * 10).save() for i in xrange(1, 4)] + + self.assertEqual(self.Person.objects().skip(1).delete(), 2) # test Document delete with existing documents + + self.Person.objects().delete() + self.assertEqual(self.Person.objects().skip(1).delete(), 0) # test Document delete without existing documents + if __name__ == '__main__': unittest.main()