From 2420b5e937d29b93ba2a5bc9d464c8367bcdde0c Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Wed, 1 Aug 2012 15:14:56 +0100 Subject: [PATCH] Fixed MapField lookup for fields without declared lookups (MongoEngine/mongoengine#46) --- docs/changelog.rst | 1 + mongoengine/queryset.py | 2 +- tests/test_fields.py | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index f5f1dfd9..1f52dfd4 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in 0.6.X ================ +- Fixed MapField lookup for fields without declared lookups (MongoEngine/mongoengine#46) - Fixed BinaryField python value issue (MongoEngine/mongoengine#48) - Fixed SequenceField non numeric value lookup (MongoEngine/mongoengine#41) - Fixed queryset manager issue (MongoEngine/mongoengine#52) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 15c768dd..b7453c6a 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -641,7 +641,7 @@ class QuerySet(object): from mongoengine.fields import ReferenceField, GenericReferenceField if isinstance(field, (ReferenceField, GenericReferenceField)): raise InvalidQueryError('Cannot perform join in mongoDB: %s' % '__'.join(parts)) - if getattr(field, 'field', None): + if hasattr(getattr(field, 'field', None), 'lookup_member'): new_field = field.field.lookup_member(field_name) else: # Look up subfield on the previous field diff --git a/tests/test_fields.py b/tests/test_fields.py index 29f5fe97..d3430031 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -929,6 +929,19 @@ class FieldTest(unittest.TestCase): doc = self.db.test.find_one() self.assertEqual(doc['x']['DICTIONARY_KEY']['i'], 2) + def test_map_field_lookup(self): + """Ensure MapField lookups succeed on Fields without a lookup method""" + + class Log(Document): + name = StringField() + visited = MapField(DateTimeField()) + + Log.drop_collection() + Log(name="wilson", visited={'friends': datetime.now()}).save() + + self.assertEqual(1, Log.objects( + visited__friends__exists=True).count()) + def test_embedded_db_field(self): class Embedded(EmbeddedDocument):