Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
bf6f4c48c0 | ||
|
fc3db7942d | ||
|
164e2b2678 | ||
|
b7b28390df | ||
|
a6e996d921 | ||
|
07e666345d | ||
|
007f10d29d | ||
|
0a1ba7c434 | ||
|
cceef33fef |
1
AUTHORS
1
AUTHORS
@@ -231,3 +231,4 @@ that much better:
|
|||||||
* Lars Butler (https://github.com/larsbutler)
|
* Lars Butler (https://github.com/larsbutler)
|
||||||
* George Macon (https://github.com/gmacon)
|
* George Macon (https://github.com/gmacon)
|
||||||
* Ashley Whetter (https://github.com/AWhetter)
|
* Ashley Whetter (https://github.com/AWhetter)
|
||||||
|
* Steven Rossiter (https://github.com/BeardedSteve)
|
||||||
|
@@ -2,6 +2,11 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
Changes in 0.10.4 - DEV
|
||||||
|
=======================
|
||||||
|
- SaveConditionError is now importable from the top level package. #1165
|
||||||
|
- upsert_one method added. #1157
|
||||||
|
|
||||||
Changes in 0.10.3
|
Changes in 0.10.3
|
||||||
=================
|
=================
|
||||||
- Fix `read_preference` (it had chaining issues with PyMongo 2.x and it didn't work at all with PyMongo 3.x) #1042
|
- Fix `read_preference` (it had chaining issues with PyMongo 2.x and it didn't work at all with PyMongo 3.x) #1042
|
||||||
|
@@ -14,7 +14,7 @@ import errors
|
|||||||
__all__ = (list(document.__all__) + fields.__all__ + connection.__all__ +
|
__all__ = (list(document.__all__) + fields.__all__ + connection.__all__ +
|
||||||
list(queryset.__all__) + signals.__all__ + list(errors.__all__))
|
list(queryset.__all__) + signals.__all__ + list(errors.__all__))
|
||||||
|
|
||||||
VERSION = (0, 10, 1)
|
VERSION = (0, 10, 4)
|
||||||
|
|
||||||
|
|
||||||
def get_version():
|
def get_version():
|
||||||
|
@@ -217,7 +217,7 @@ class Document(BaseDocument):
|
|||||||
Returns True if the document has been updated or False if the document
|
Returns True if the document has been updated or False if the document
|
||||||
in the database doesn't match the query.
|
in the database doesn't match the query.
|
||||||
|
|
||||||
.. note:: All unsaved changes that has been made to the document are
|
.. note:: All unsaved changes that have been made to the document are
|
||||||
rejected if the method returns True.
|
rejected if the method returns True.
|
||||||
|
|
||||||
:param query: the update will be performed only if the document in the
|
:param query: the update will be performed only if the document in the
|
||||||
@@ -407,7 +407,7 @@ class Document(BaseDocument):
|
|||||||
|
|
||||||
def cascade_save(self, *args, **kwargs):
|
def cascade_save(self, *args, **kwargs):
|
||||||
"""Recursively saves any references /
|
"""Recursively saves any references /
|
||||||
generic references on an objects"""
|
generic references on the document"""
|
||||||
_refs = kwargs.get('_refs', []) or []
|
_refs = kwargs.get('_refs', []) or []
|
||||||
|
|
||||||
ReferenceField = _import_class('ReferenceField')
|
ReferenceField = _import_class('ReferenceField')
|
||||||
|
@@ -6,7 +6,7 @@ from mongoengine.python_support import txt_type
|
|||||||
__all__ = ('NotRegistered', 'InvalidDocumentError', 'LookUpError',
|
__all__ = ('NotRegistered', 'InvalidDocumentError', 'LookUpError',
|
||||||
'DoesNotExist', 'MultipleObjectsReturned', 'InvalidQueryError',
|
'DoesNotExist', 'MultipleObjectsReturned', 'InvalidQueryError',
|
||||||
'OperationError', 'NotUniqueError', 'FieldDoesNotExist',
|
'OperationError', 'NotUniqueError', 'FieldDoesNotExist',
|
||||||
'ValidationError')
|
'ValidationError', 'SaveConditionError')
|
||||||
|
|
||||||
|
|
||||||
class NotRegistered(Exception):
|
class NotRegistered(Exception):
|
||||||
|
@@ -471,6 +471,32 @@ class BaseQuerySet(object):
|
|||||||
raise OperationError(message)
|
raise OperationError(message)
|
||||||
raise OperationError(u'Update failed (%s)' % unicode(err))
|
raise OperationError(u'Update failed (%s)' % unicode(err))
|
||||||
|
|
||||||
|
|
||||||
|
def upsert_one(self, write_concern=None, **update):
|
||||||
|
"""Overwrite or add the first document matched by the query.
|
||||||
|
|
||||||
|
:param write_concern: Extra keyword arguments are passed down which
|
||||||
|
will be used as options for the resultant
|
||||||
|
``getLastError`` command. For example,
|
||||||
|
``save(..., write_concern={w: 2, fsync: True}, ...)`` will
|
||||||
|
wait until at least two servers have recorded the write and
|
||||||
|
will force an fsync on the primary server.
|
||||||
|
:param update: Django-style update keyword arguments
|
||||||
|
|
||||||
|
:returns the new or overwritten document
|
||||||
|
|
||||||
|
.. versionadded:: 0.10.2
|
||||||
|
"""
|
||||||
|
|
||||||
|
atomic_update = self.update(multi=False, upsert=True, write_concern=write_concern,
|
||||||
|
full_result=True,**update)
|
||||||
|
|
||||||
|
if atomic_update['updatedExisting']:
|
||||||
|
document = self.get()
|
||||||
|
else:
|
||||||
|
document = self._document.objects.with_id(atomic_update['upserted'])
|
||||||
|
return document
|
||||||
|
|
||||||
def update_one(self, upsert=False, write_concern=None, **update):
|
def update_one(self, upsert=False, write_concern=None, **update):
|
||||||
"""Perform an atomic update on the fields of the first document
|
"""Perform an atomic update on the fields of the first document
|
||||||
matched by the query.
|
matched by the query.
|
||||||
|
@@ -680,12 +680,21 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
def test_upsert_one(self):
|
def test_upsert_one(self):
|
||||||
self.Person.drop_collection()
|
self.Person.drop_collection()
|
||||||
|
|
||||||
self.Person.objects(name="Bob", age=30).update_one(upsert=True)
|
bob = self.Person.objects(name="Bob", age=30).upsert_one()
|
||||||
|
|
||||||
bob = self.Person.objects.first()
|
|
||||||
self.assertEqual("Bob", bob.name)
|
self.assertEqual("Bob", bob.name)
|
||||||
self.assertEqual(30, bob.age)
|
self.assertEqual(30, bob.age)
|
||||||
|
|
||||||
|
bob.name = "Bobby"
|
||||||
|
bob.save()
|
||||||
|
|
||||||
|
bobby = self.Person.objects(name="Bobby", age=30).upsert_one()
|
||||||
|
|
||||||
|
self.assertEqual("Bobby", bobby.name)
|
||||||
|
self.assertEqual(30, bobby.age)
|
||||||
|
self.assertEqual(bob.id, bobby.id)
|
||||||
|
|
||||||
|
|
||||||
def test_set_on_insert(self):
|
def test_set_on_insert(self):
|
||||||
self.Person.drop_collection()
|
self.Person.drop_collection()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user