Fix side effect of no_dereference on GenericReferenceField
This commit is contained in:
parent
1887f5b7e7
commit
45c2151d0f
@ -1266,10 +1266,10 @@ class CachedReferenceField(BaseField):
|
|||||||
|
|
||||||
# Get value from document instance if available
|
# Get value from document instance if available
|
||||||
value = instance._data.get(self.name)
|
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
|
# 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)
|
dereferenced = self.document_type._get_db().dereference(value)
|
||||||
if dereferenced is None:
|
if dereferenced is None:
|
||||||
raise DoesNotExist('Trying to dereference unknown document %s' % value)
|
raise DoesNotExist('Trying to dereference unknown document %s' % value)
|
||||||
@ -1402,8 +1402,8 @@ class GenericReferenceField(BaseField):
|
|||||||
|
|
||||||
value = instance._data.get(self.name)
|
value = instance._data.get(self.name)
|
||||||
|
|
||||||
self._auto_dereference = instance._fields[self.name]._auto_dereference
|
auto_dereference = instance._fields[self.name]._auto_dereference
|
||||||
if self._auto_dereference and isinstance(value, (dict, SON)):
|
if auto_dereference and isinstance(value, (dict, SON)):
|
||||||
dereferenced = self.dereference(value)
|
dereferenced = self.dereference(value)
|
||||||
if dereferenced is None:
|
if dereferenced is None:
|
||||||
raise DoesNotExist('Trying to dereference unknown document %s' % value)
|
raise DoesNotExist('Trying to dereference unknown document %s' % value)
|
||||||
|
@ -4720,12 +4720,14 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
|
|
||||||
class User(Document):
|
class User(Document):
|
||||||
organization = ReferenceField(Organization)
|
organization = ReferenceField(Organization)
|
||||||
|
organization_gen = GenericReferenceField()
|
||||||
|
|
||||||
User.drop_collection()
|
User.drop_collection()
|
||||||
Organization.drop_collection()
|
Organization.drop_collection()
|
||||||
|
|
||||||
org = Organization(name="whatever").save()
|
org = Organization(name="whatever").save()
|
||||||
User(organization=org).save()
|
User(organization=org,
|
||||||
|
organization_gen=org).save()
|
||||||
|
|
||||||
qs = User.objects()
|
qs = User.objects()
|
||||||
user = qs.first()
|
user = qs.first()
|
||||||
@ -4733,10 +4735,16 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
qs_no_deref = User.objects().no_dereference()
|
qs_no_deref = User.objects().no_dereference()
|
||||||
user_no_deref = qs_no_deref.first()
|
user_no_deref = qs_no_deref.first()
|
||||||
|
|
||||||
|
# ReferenceField
|
||||||
no_derf_org = user_no_deref.organization # was triggering the bug
|
no_derf_org = user_no_deref.organization # was triggering the bug
|
||||||
self.assertIsInstance(no_derf_org, DBRef)
|
self.assertIsInstance(no_derf_org, DBRef)
|
||||||
self.assertIsInstance(user.organization, Organization)
|
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):
|
def test_no_dereference_embedded_doc(self):
|
||||||
|
|
||||||
class User(Document):
|
class User(Document):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user