Merge pull request #727 from DavidBord/fix-725
fix-#725: queryset delete() should return the number of deleted objects
This commit is contained in:
commit
fda672f806
@ -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):
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user