Merge pull request #1652 from erdenezul/generic_embedded_query

Subfield resolve error in generic_emdedded_document query #1651
This commit is contained in:
Emmanuel Leblond 2017-11-13 15:29:26 +01:00 committed by GitHub
commit 13180d92e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 0 deletions

View File

@ -694,6 +694,14 @@ class GenericEmbeddedDocumentField(BaseField):
value.validate(clean=clean) value.validate(clean=clean)
def lookup_member(self, member_name):
if self.choices:
for choice in self.choices:
field = choice._fields.get(member_name)
if field:
return field
return None
def to_mongo(self, document, use_db_field=True, fields=None): def to_mongo(self, document, use_db_field=True, fields=None):
if document is None: if document is None:
return None return None

View File

@ -4790,6 +4790,30 @@ class QuerySetTest(unittest.TestCase):
for obj in C.objects.no_sub_classes(): for obj in C.objects.no_sub_classes():
self.assertEqual(obj.__class__, C) self.assertEqual(obj.__class__, C)
def test_query_generic_embedded_document(self):
"""Ensure that querying sub field on generic_embedded_field works
"""
class A(EmbeddedDocument):
a_name = StringField()
class B(EmbeddedDocument):
b_name = StringField()
class Doc(Document):
document = GenericEmbeddedDocumentField(choices=(A, B))
Doc.drop_collection()
Doc(document=A(a_name='A doc')).save()
Doc(document=B(b_name='B doc')).save()
# Using raw in filter working fine
self.assertEqual(Doc.objects(
__raw__={'document.a_name': 'A doc'}).count(), 1)
self.assertEqual(Doc.objects(
__raw__={'document.b_name': 'B doc'}).count(), 1)
self.assertEqual(Doc.objects(document__a_name='A doc').count(), 1)
self.assertEqual(Doc.objects(document__b_name='B doc').count(), 1)
def test_query_reference_to_custom_pk_doc(self): def test_query_reference_to_custom_pk_doc(self):
class A(Document): class A(Document):