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