Merge pull request #1018 from MRigal/fix/517-no_dereference-not-respected-on-embedded-docs

Respect no_dereference() on embedded docs containing Ref
This commit is contained in:
Matthieu Rigal 2015-06-11 14:16:11 +02:00
commit 1d5b5b7d15
4 changed files with 39 additions and 2 deletions

View File

@ -19,6 +19,7 @@ Changes in 0.9.X - DEV
- Added __ support to escape field name in fields lookup keywords that match operators names #949
- Support for PyMongo 3+ #946
- Fix for issue where FileField deletion did not free space in GridFS.
- No_dereference() not respected on embedded docs containing reference. #517
Changes in 0.9.0
================

View File

@ -290,6 +290,7 @@ class ComplexBaseField(BaseField):
return value
if self.field:
self.field._auto_dereference = self._auto_dereference
value_dict = dict([(key, self.field.to_python(item))
for key, item in value.items()])
else:

View File

@ -546,7 +546,7 @@ class EmbeddedDocumentField(BaseField):
def to_python(self, value):
if not isinstance(value, self.document_type):
return self.document_type._from_son(value)
return self.document_type._from_son(value, _auto_dereference=self._auto_dereference)
return value
def to_mongo(self, value, use_db_field=True, fields=[]):

View File

@ -13,7 +13,7 @@ import pymongo
from pymongo.errors import ConfigurationError
from pymongo.read_preferences import ReadPreference
from bson import ObjectId
from bson import ObjectId, DBRef
from mongoengine import *
from mongoengine.connection import get_connection, get_db
@ -4219,6 +4219,41 @@ class QuerySetTest(unittest.TestCase):
Organization))
self.assertTrue(isinstance(qs.first().organization, Organization))
def test_no_dereference_embedded_doc(self):
class User(Document):
name = StringField()
class Member(EmbeddedDocument):
name = StringField()
user = ReferenceField(User)
class Organization(Document):
name = StringField()
members = ListField(EmbeddedDocumentField(Member))
ceo = ReferenceField(User)
member = EmbeddedDocumentField(Member)
admin = ListField(ReferenceField(User))
Organization.drop_collection()
User.drop_collection()
user = User(name="Flash")
user.save()
member = Member(name="Flash", user=user)
company = Organization(name="Mongo Inc", ceo=user, member=member)
company.admin.append(user)
company.members.append(member)
company.save()
result = Organization.objects().no_dereference().first()
self.assertTrue(isinstance(result.admin[0], (DBRef, ObjectId)))
self.assertTrue(isinstance(result.member.user, (DBRef, ObjectId)))
self.assertTrue(isinstance(result.members[0].user, (DBRef, ObjectId)))
def test_cached_queryset(self):
class Person(Document):
name = StringField()