Merge branch 'master' of https://github.com/MongoEngine/mongoengine
Conflicts: AUTHORS
This commit is contained in:
commit
e0d2fab3c3
1
AUTHORS
1
AUTHORS
@ -171,3 +171,4 @@ that much better:
|
|||||||
* Nigel McNie (https://github.com/nigelmcnie)
|
* Nigel McNie (https://github.com/nigelmcnie)
|
||||||
* ygbourhis (https://github.com/ygbourhis)
|
* ygbourhis (https://github.com/ygbourhis)
|
||||||
* Bob Dickinson (https://github.com/BobDickinson)
|
* Bob Dickinson (https://github.com/BobDickinson)
|
||||||
|
* Michael Bartnett (https://github.com/michaelbartnett)
|
||||||
|
@ -2,6 +2,11 @@
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
Changes in 0.8.3
|
||||||
|
================
|
||||||
|
- Fixed weakref being valid after reload (#374)
|
||||||
|
- Fixed queryset.get() respecting no_dereference (#373)
|
||||||
|
- Added full_result kwarg to update (#380)
|
||||||
|
|
||||||
Changes in 0.8.2
|
Changes in 0.8.2
|
||||||
================
|
================
|
||||||
|
@ -353,7 +353,13 @@ class Document(BaseDocument):
|
|||||||
been saved.
|
been saved.
|
||||||
"""
|
"""
|
||||||
if not self.pk:
|
if not self.pk:
|
||||||
raise OperationError('attempt to update a document not yet saved')
|
if kwargs.get('upsert', False):
|
||||||
|
query = self.to_mongo()
|
||||||
|
if "_cls" in query:
|
||||||
|
del(query["_cls"])
|
||||||
|
return self._qs.filter(**query).update_one(**kwargs)
|
||||||
|
else:
|
||||||
|
raise OperationError('attempt to update a document not yet saved')
|
||||||
|
|
||||||
# Need to add shard key to query, or you get an error
|
# Need to add shard key to query, or you get an error
|
||||||
return self._qs.filter(**self._object_key).update_one(**kwargs)
|
return self._qs.filter(**self._object_key).update_one(**kwargs)
|
||||||
@ -474,6 +480,7 @@ class Document(BaseDocument):
|
|||||||
value = [self._reload(key, v) for v in value]
|
value = [self._reload(key, v) for v in value]
|
||||||
value = BaseList(value, self, key)
|
value = BaseList(value, self, key)
|
||||||
elif isinstance(value, (EmbeddedDocument, DynamicEmbeddedDocument)):
|
elif isinstance(value, (EmbeddedDocument, DynamicEmbeddedDocument)):
|
||||||
|
value._instance = None
|
||||||
value._changed_fields = []
|
value._changed_fields = []
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -245,8 +245,10 @@ class QuerySet(object):
|
|||||||
|
|
||||||
.. versionadded:: 0.3
|
.. versionadded:: 0.3
|
||||||
"""
|
"""
|
||||||
queryset = self.__call__(*q_objs, **query)
|
queryset = self.clone()
|
||||||
queryset = queryset.limit(2)
|
queryset = queryset.limit(2)
|
||||||
|
queryset = queryset.filter(*q_objs, **query)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = queryset.next()
|
result = queryset.next()
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
@ -472,7 +474,8 @@ class QuerySet(object):
|
|||||||
|
|
||||||
queryset._collection.remove(queryset._query, write_concern=write_concern)
|
queryset._collection.remove(queryset._query, write_concern=write_concern)
|
||||||
|
|
||||||
def update(self, upsert=False, multi=True, write_concern=None, **update):
|
def update(self, upsert=False, multi=True, write_concern=None,
|
||||||
|
full_result=False, **update):
|
||||||
"""Perform an atomic update on the fields matched by the query.
|
"""Perform an atomic update on the fields matched by the query.
|
||||||
|
|
||||||
:param upsert: Any existing document with that "_id" is overwritten.
|
:param upsert: Any existing document with that "_id" is overwritten.
|
||||||
@ -483,6 +486,8 @@ class QuerySet(object):
|
|||||||
``save(..., write_concern={w: 2, fsync: True}, ...)`` will
|
``save(..., write_concern={w: 2, fsync: True}, ...)`` will
|
||||||
wait until at least two servers have recorded the write and
|
wait until at least two servers have recorded the write and
|
||||||
will force an fsync on the primary server.
|
will force an fsync on the primary server.
|
||||||
|
:param full_result: Return the full result rather than just the number
|
||||||
|
updated.
|
||||||
:param update: Django-style update keyword arguments
|
:param update: Django-style update keyword arguments
|
||||||
|
|
||||||
.. versionadded:: 0.2
|
.. versionadded:: 0.2
|
||||||
@ -504,12 +509,13 @@ class QuerySet(object):
|
|||||||
update["$set"]["_cls"] = queryset._document._class_name
|
update["$set"]["_cls"] = queryset._document._class_name
|
||||||
else:
|
else:
|
||||||
update["$set"] = {"_cls": queryset._document._class_name}
|
update["$set"] = {"_cls": queryset._document._class_name}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ret = queryset._collection.update(query, update, multi=multi,
|
result = queryset._collection.update(query, update, multi=multi,
|
||||||
upsert=upsert, **write_concern)
|
upsert=upsert, **write_concern)
|
||||||
if ret is not None and 'n' in ret:
|
if full_result:
|
||||||
return ret['n']
|
return result
|
||||||
|
elif result:
|
||||||
|
return result['n']
|
||||||
except pymongo.errors.OperationFailure, err:
|
except pymongo.errors.OperationFailure, err:
|
||||||
if unicode(err) == u'multi not coded yet':
|
if unicode(err) == u'multi not coded yet':
|
||||||
message = u'update() method requires MongoDB 1.1.3+'
|
message = u'update() method requires MongoDB 1.1.3+'
|
||||||
@ -1159,8 +1165,8 @@ class QuerySet(object):
|
|||||||
raw_doc = self._cursor.next()
|
raw_doc = self._cursor.next()
|
||||||
if self._as_pymongo:
|
if self._as_pymongo:
|
||||||
return self._get_as_pymongo(raw_doc)
|
return self._get_as_pymongo(raw_doc)
|
||||||
|
doc = self._document._from_son(raw_doc,
|
||||||
doc = self._document._from_son(raw_doc)
|
_auto_dereference=self._auto_dereference)
|
||||||
if self._scalar:
|
if self._scalar:
|
||||||
return self._get_scalar(doc)
|
return self._get_scalar(doc)
|
||||||
|
|
||||||
|
@ -536,6 +536,23 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertEqual(club.members['John']['gender'], "F")
|
self.assertEqual(club.members['John']['gender'], "F")
|
||||||
self.assertEqual(club.members['John']['age'], 14)
|
self.assertEqual(club.members['John']['age'], 14)
|
||||||
|
|
||||||
|
def test_update_results(self):
|
||||||
|
self.Person.drop_collection()
|
||||||
|
|
||||||
|
result = self.Person(name="Bob", age=25).update(upsert=True, full_result=True)
|
||||||
|
self.assertIsInstance(result, dict)
|
||||||
|
self.assertTrue("upserted" in result)
|
||||||
|
self.assertFalse(result["updatedExisting"])
|
||||||
|
|
||||||
|
bob = self.Person.objects.first()
|
||||||
|
result = bob.update(set__age=30, full_result=True)
|
||||||
|
self.assertIsInstance(result, dict)
|
||||||
|
self.assertTrue(result["updatedExisting"])
|
||||||
|
|
||||||
|
self.Person(name="Bob", age=20).save()
|
||||||
|
result = self.Person.objects(name="Bob").update(set__name="bobby", multi=True)
|
||||||
|
self.assertEqual(result, 2)
|
||||||
|
|
||||||
def test_upsert(self):
|
def test_upsert(self):
|
||||||
self.Person.drop_collection()
|
self.Person.drop_collection()
|
||||||
|
|
||||||
@ -1596,6 +1613,32 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertEqual(message.authors[1].name, "Ross")
|
self.assertEqual(message.authors[1].name, "Ross")
|
||||||
self.assertEqual(message.authors[2].name, "Adam")
|
self.assertEqual(message.authors[2].name, "Adam")
|
||||||
|
|
||||||
|
def test_reload_embedded_docs_instance(self):
|
||||||
|
|
||||||
|
class SubDoc(EmbeddedDocument):
|
||||||
|
val = IntField()
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
embedded = EmbeddedDocumentField(SubDoc)
|
||||||
|
|
||||||
|
doc = Doc(embedded=SubDoc(val=0)).save()
|
||||||
|
doc.reload()
|
||||||
|
|
||||||
|
self.assertEqual(doc.pk, doc.embedded._instance.pk)
|
||||||
|
|
||||||
|
def test_reload_list_embedded_docs_instance(self):
|
||||||
|
|
||||||
|
class SubDoc(EmbeddedDocument):
|
||||||
|
val = IntField()
|
||||||
|
|
||||||
|
class Doc(Document):
|
||||||
|
embedded = ListField(EmbeddedDocumentField(SubDoc))
|
||||||
|
|
||||||
|
doc = Doc(embedded=[SubDoc(val=0)]).save()
|
||||||
|
doc.reload()
|
||||||
|
|
||||||
|
self.assertEqual(doc.pk, doc.embedded[0]._instance.pk)
|
||||||
|
|
||||||
def test_order_by(self):
|
def test_order_by(self):
|
||||||
"""Ensure that QuerySets may be ordered.
|
"""Ensure that QuerySets may be ordered.
|
||||||
"""
|
"""
|
||||||
@ -3241,6 +3284,8 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
self.assertTrue(isinstance(qs.first().organization, Organization))
|
self.assertTrue(isinstance(qs.first().organization, Organization))
|
||||||
self.assertFalse(isinstance(qs.no_dereference().first().organization,
|
self.assertFalse(isinstance(qs.no_dereference().first().organization,
|
||||||
Organization))
|
Organization))
|
||||||
|
self.assertFalse(isinstance(qs.no_dereference().get().organization,
|
||||||
|
Organization))
|
||||||
self.assertTrue(isinstance(qs.first().organization, Organization))
|
self.assertTrue(isinstance(qs.first().organization, Organization))
|
||||||
|
|
||||||
def test_cached_queryset(self):
|
def test_cached_queryset(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user