Improve error message for invalid query

This commit is contained in:
Matthieu Rigal 2015-06-11 17:48:34 +02:00
parent dba4c33c81
commit a2f0f20284
3 changed files with 17 additions and 3 deletions

View File

@ -983,8 +983,13 @@ class BaseDocument(object):
if hasattr(getattr(field, 'field', None), 'lookup_member'): if hasattr(getattr(field, 'field', None), 'lookup_member'):
new_field = field.field.lookup_member(field_name) new_field = field.field.lookup_member(field_name)
else: else:
# Look up subfield on the previous field # Look up subfield on the previous field or raise
new_field = field.lookup_member(field_name) 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 not new_field and isinstance(field, ComplexBaseField):
if hasattr(field.field, 'document_type') and cls._dynamic \ if hasattr(field.field, 'document_type') and cls._dynamic \
and field.field.document_type._dynamic: and field.field.document_type._dynamic:

View File

@ -44,7 +44,7 @@ def query(_doc_cls=None, _field_operation=False, **query):
if len(parts) > 1 and parts[-1] in MATCH_OPERATORS: if len(parts) > 1 and parts[-1] in MATCH_OPERATORS:
op = parts.pop() op = parts.pop()
#if user escape field name by __ # if user escape field name by __
if len(parts) > 1 and parts[-1] == "": if len(parts) > 1 and parts[-1] == "":
parts.pop() parts.pop()

View File

@ -224,6 +224,15 @@ class TransformTest(unittest.TestCase):
self.assertEqual(1, Doc.objects(item__type__="axe").count()) self.assertEqual(1, Doc.objects(item__type__="axe").count())
self.assertEqual(1, Doc.objects(item__name__="Heroic 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__': if __name__ == '__main__':
unittest.main() unittest.main()