Merge pull request #1901 from bagerard/fix_side_effect_no_dereference_on_GenericReferenceField

Fix side effect of no_dereference on GenericReferenceField
This commit is contained in:
erdenezul 2018-09-26 06:45:17 +08:00 committed by GitHub
commit 17b140baf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 5 deletions

View File

@ -1266,10 +1266,10 @@ class CachedReferenceField(BaseField):
# Get value from document instance if available
value = instance._data.get(self.name)
self._auto_dereference = instance._fields[self.name]._auto_dereference
auto_dereference = instance._fields[self.name]._auto_dereference
# Dereference DBRefs
if self._auto_dereference and isinstance(value, DBRef):
if auto_dereference and isinstance(value, DBRef):
dereferenced = self.document_type._get_db().dereference(value)
if dereferenced is None:
raise DoesNotExist('Trying to dereference unknown document %s' % value)
@ -1402,8 +1402,8 @@ class GenericReferenceField(BaseField):
value = instance._data.get(self.name)
self._auto_dereference = instance._fields[self.name]._auto_dereference
if self._auto_dereference and isinstance(value, (dict, SON)):
auto_dereference = instance._fields[self.name]._auto_dereference
if auto_dereference and isinstance(value, (dict, SON)):
dereferenced = self.dereference(value)
if dereferenced is None:
raise DoesNotExist('Trying to dereference unknown document %s' % value)

View File

@ -4720,12 +4720,14 @@ class QuerySetTest(unittest.TestCase):
class User(Document):
organization = ReferenceField(Organization)
organization_gen = GenericReferenceField()
User.drop_collection()
Organization.drop_collection()
org = Organization(name="whatever").save()
User(organization=org).save()
User(organization=org,
organization_gen=org).save()
qs = User.objects()
user = qs.first()
@ -4733,10 +4735,16 @@ class QuerySetTest(unittest.TestCase):
qs_no_deref = User.objects().no_dereference()
user_no_deref = qs_no_deref.first()
# ReferenceField
no_derf_org = user_no_deref.organization # was triggering the bug
self.assertIsInstance(no_derf_org, DBRef)
self.assertIsInstance(user.organization, Organization)
# GenericReferenceField
no_derf_org_gen = user_no_deref.organization_gen
self.assertIsInstance(no_derf_org_gen, dict)
self.assertIsInstance(user.organization_gen, Organization)
def test_no_dereference_embedded_doc(self):
class User(Document):