From a2f0f20284ed28c8633ebc6b01a6e9ca71b04f83 Mon Sep 17 00:00:00 2001 From: Matthieu Rigal Date: Thu, 11 Jun 2015 17:48:34 +0200 Subject: [PATCH] Improve error message for invalid query --- mongoengine/base/document.py | 9 +++++++-- mongoengine/queryset/transform.py | 2 +- tests/queryset/transform.py | 9 +++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 5707992a..1ab19e75 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -983,8 +983,13 @@ class BaseDocument(object): if hasattr(getattr(field, 'field', None), 'lookup_member'): new_field = field.field.lookup_member(field_name) else: - # Look up subfield on the previous field - new_field = field.lookup_member(field_name) + # Look up subfield on the previous field or raise + try: + new_field = field.lookup_member(field_name) + except AttributeError: + raise LookUpError('Cannot resolve subfield or operator {} ' + 'on the field {}'.format( + field_name, field.name)) if not new_field and isinstance(field, ComplexBaseField): if hasattr(field.field, 'document_type') and cls._dynamic \ and field.field.document_type._dynamic: diff --git a/mongoengine/queryset/transform.py b/mongoengine/queryset/transform.py index c43c4b40..f6cfa87e 100644 --- a/mongoengine/queryset/transform.py +++ b/mongoengine/queryset/transform.py @@ -44,7 +44,7 @@ def query(_doc_cls=None, _field_operation=False, **query): if len(parts) > 1 and parts[-1] in MATCH_OPERATORS: op = parts.pop() - #if user escape field name by __ + # if user escape field name by __ if len(parts) > 1 and parts[-1] == "": parts.pop() diff --git a/tests/queryset/transform.py b/tests/queryset/transform.py index 77d3593c..a543317a 100644 --- a/tests/queryset/transform.py +++ b/tests/queryset/transform.py @@ -224,6 +224,15 @@ class TransformTest(unittest.TestCase): self.assertEqual(1, Doc.objects(item__type__="axe").count()) self.assertEqual(1, Doc.objects(item__name__="Heroic axe").count()) + def test_understandable_error_raised(self): + class Event(Document): + title = StringField() + location = GeoPointField() + + box = [(35.0, -125.0), (40.0, -100.0)] + # I *meant* to execute location__within_box=box + events = Event.objects(location__within=box) + self.assertRaises(InvalidQueryError, lambda: events.count()) if __name__ == '__main__': unittest.main()