replaced find_and_modify by PyMongo3 equivalents

This commit is contained in:
mrigal 2015-04-11 01:31:54 +02:00 committed by Matthieu Rigal
parent 3db896c4e2
commit 0a65006bb4

View File

@ -13,6 +13,7 @@ from bson import json_util
import pymongo import pymongo
import pymongo.errors import pymongo.errors
from pymongo.common import validate_read_preference from pymongo.common import validate_read_preference
from pymongo.collection import ReturnDocument
from mongoengine import signals from mongoengine import signals
from mongoengine.connection import get_db from mongoengine.connection import get_db
@ -547,7 +548,7 @@ class BaseQuerySet(object):
:param upsert: insert if document doesn't exist (default ``False``) :param upsert: insert if document doesn't exist (default ``False``)
:param full_response: return the entire response object from the :param full_response: return the entire response object from the
server (default ``False``) server (default ``False``, not available for PyMongo 3+)
:param remove: remove rather than updating (default ``False``) :param remove: remove rather than updating (default ``False``)
:param new: return updated rather than original document :param new: return updated rather than original document
(default ``False``) (default ``False``)
@ -565,13 +566,31 @@ class BaseQuerySet(object):
queryset = self.clone() queryset = self.clone()
query = queryset._query query = queryset._query
update = transform.update(queryset._document, **update) if not remove and IS_PYMONGO_3:
update = transform.update(queryset._document, **update)
sort = queryset._ordering sort = queryset._ordering
try: try:
result = queryset._collection.find_and_modify( if IS_PYMONGO_3:
query, update, upsert=upsert, sort=sort, remove=remove, new=new, if full_response:
full_response=full_response, **self._cursor_args) msg = ("With PyMongo 3+, it is not possible anymore to get the full response.")
warnings.warn(msg, DeprecationWarning)
if remove:
result = queryset._collection.find_one_and_delete(
query, sort=sort, **self._cursor_args)
else:
if new:
return_doc = ReturnDocument.AFTER
else:
return_doc = ReturnDocument.BEFORE
result = queryset._collection.find_one_and_update(
query, update, upsert=upsert, sort=sort, return_document=return_doc,
**self._cursor_args)
else:
result = queryset._collection.find_and_modify(
query, update, upsert=upsert, sort=sort, remove=remove, new=new,
full_response=full_response, **self._cursor_args)
except pymongo.errors.DuplicateKeyError, err: except pymongo.errors.DuplicateKeyError, err:
raise NotUniqueError(u"Update failed (%s)" % err) raise NotUniqueError(u"Update failed (%s)" % err)
except pymongo.errors.OperationFailure, err: except pymongo.errors.OperationFailure, err: