remove pymongo deprecated methods: find_and_modify & remove

This commit is contained in:
Bastien Gérard 2019-06-19 23:04:23 +02:00
parent e8dbd12f22
commit 8f57279dc7
3 changed files with 18 additions and 13 deletions

View File

@ -10,6 +10,7 @@ from operator import itemgetter
from bson import Binary, DBRef, ObjectId, SON from bson import Binary, DBRef, ObjectId, SON
import gridfs import gridfs
import pymongo import pymongo
from pymongo import ReturnDocument
import six import six
from six import iteritems from six import iteritems
@ -1964,10 +1965,12 @@ class SequenceField(BaseField):
sequence_name = self.get_sequence_name() sequence_name = self.get_sequence_name()
sequence_id = '%s.%s' % (sequence_name, self.name) sequence_id = '%s.%s' % (sequence_name, self.name)
collection = get_db(alias=self.db_alias)[self.collection_name] collection = get_db(alias=self.db_alias)[self.collection_name]
counter = collection.find_and_modify(query={'_id': sequence_id},
update={'$inc': {'next': 1}}, counter = collection.find_one_and_update(
new=True, filter={'_id': sequence_id},
upsert=True) update={'$inc': {'next': 1}},
return_document=ReturnDocument.AFTER,
upsert=True)
return self.value_decorator(counter['next']) return self.value_decorator(counter['next'])
def set_next_value(self, value): def set_next_value(self, value):
@ -1975,10 +1978,11 @@ class SequenceField(BaseField):
sequence_name = self.get_sequence_name() sequence_name = self.get_sequence_name()
sequence_id = "%s.%s" % (sequence_name, self.name) sequence_id = "%s.%s" % (sequence_name, self.name)
collection = get_db(alias=self.db_alias)[self.collection_name] collection = get_db(alias=self.db_alias)[self.collection_name]
counter = collection.find_and_modify(query={"_id": sequence_id}, counter = collection.find_one_and_update(
update={"$set": {"next": value}}, filter={"_id": sequence_id},
new=True, update={"$set": {"next": value}},
upsert=True) return_document=ReturnDocument.AFTER,
upsert=True)
return self.value_decorator(counter['next']) return self.value_decorator(counter['next'])
def get_next_value(self): def get_next_value(self):

View File

@ -480,9 +480,10 @@ class BaseQuerySet(object):
write_concern=write_concern, write_concern=write_concern,
**{'pull_all__%s' % field_name: self}) **{'pull_all__%s' % field_name: self})
result = queryset._collection.remove(queryset._query, **write_concern) with set_write_concern(queryset._collection, write_concern) as collection:
if result: result = collection.delete_many(queryset._query)
return result.get('n') if result.acknowledged:
return result.deleted_count
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):

View File

@ -1857,8 +1857,8 @@ class QuerySetTest(unittest.TestCase):
self.Person.objects()[:1].delete() self.Person.objects()[:1].delete()
self.assertEqual(1, BlogPost.objects.count()) self.assertEqual(1, BlogPost.objects.count())
def test_limit_with_write_concern_0(self): def test_delete_edge_case_with_write_concern_0_return_None(self):
"""Return None when write is unacknowledged"""
p1 = self.Person(name="User Z", age=20).save() p1 = self.Person(name="User Z", age=20).save()
del_result = p1.delete(w=0) del_result = p1.delete(w=0)
self.assertEqual(None, del_result) self.assertEqual(None, del_result)