fix-#725: queryset delete() should return the number of deleted objects
This commit is contained in:
parent
174d964553
commit
2f72b23a0d
@ -405,6 +405,7 @@ class BaseQuerySet(object):
|
|||||||
will force an fsync on the primary server.
|
will force an fsync on the primary server.
|
||||||
:param _from_doc_delete: True when called from document delete therefore
|
:param _from_doc_delete: True when called from document delete therefore
|
||||||
signals will have been triggered so don't loop.
|
signals will have been triggered so don't loop.
|
||||||
|
:returns number of deleted documents
|
||||||
"""
|
"""
|
||||||
queryset = self.clone()
|
queryset = self.clone()
|
||||||
doc = queryset._document
|
doc = queryset._document
|
||||||
@ -422,9 +423,11 @@ class BaseQuerySet(object):
|
|||||||
has_delete_signal) and not _from_doc_delete
|
has_delete_signal) and not _from_doc_delete
|
||||||
|
|
||||||
if call_document_delete:
|
if call_document_delete:
|
||||||
|
cnt = 0
|
||||||
for doc in queryset:
|
for doc in queryset:
|
||||||
doc.delete(write_concern=write_concern)
|
doc.delete(write_concern=write_concern)
|
||||||
return
|
cnt += 1
|
||||||
|
return cnt
|
||||||
|
|
||||||
delete_rules = doc._meta.get('delete_rules') or {}
|
delete_rules = doc._meta.get('delete_rules') or {}
|
||||||
# Check for DENY rules before actually deleting/nullifying any other
|
# Check for DENY rules before actually deleting/nullifying any other
|
||||||
@ -455,8 +458,8 @@ class BaseQuerySet(object):
|
|||||||
write_concern=write_concern,
|
write_concern=write_concern,
|
||||||
**{'pull_all__%s' % field_name: self})
|
**{'pull_all__%s' % field_name: self})
|
||||||
|
|
||||||
queryset._collection.remove(
|
result = queryset._collection.remove(queryset._query, write_concern=write_concern)
|
||||||
queryset._query, write_concern=write_concern)
|
return result["n"]
|
||||||
|
|
||||||
def update(self, upsert=False, multi=True, write_concern=None,
|
def update(self, upsert=False, multi=True, write_concern=None,
|
||||||
full_result=False, **update):
|
full_result=False, **update):
|
||||||
|
@ -4390,6 +4390,17 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
{'_id': None, 'avg': 29, 'total': 2}
|
{'_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__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user