diff --git a/mongoengine/queryset/visitor.py b/mongoengine/queryset/visitor.py index dbe3bf2f..9d97094b 100644 --- a/mongoengine/queryset/visitor.py +++ b/mongoengine/queryset/visitor.py @@ -131,6 +131,10 @@ class QCombination(QNode): else: self.children.append(node) + def __repr__(self): + op = ' & ' if self.operation is self.AND else ' | ' + return '(%s)' % op.join([repr(node) for node in self.children]) + def accept(self, visitor): for i in range(len(self.children)): if isinstance(self.children[i], QNode): @@ -151,6 +155,9 @@ class Q(QNode): def __init__(self, **query): self.query = query + def __repr__(self): + return 'Q(**%s)' % repr(self.query) + def accept(self, visitor): return visitor.visit_query(self) diff --git a/tests/queryset/visitor.py b/tests/queryset/visitor.py index 7b68cfb0..8261faae 100644 --- a/tests/queryset/visitor.py +++ b/tests/queryset/visitor.py @@ -296,6 +296,18 @@ class QTest(unittest.TestCase): obj = self.Person.objects(Q(name__not=re.compile('^Gui'))).first() self.assertEqual(obj, None) + def test_q_repr(self): + self.assertEqual(repr(Q()), 'Q(**{})') + self.assertEqual(repr(Q(name='test')), "Q(**{'name': 'test'})") + + self.assertEqual( + repr(Q(name='test') & Q(age__gte=18)), + "(Q(**{'name': 'test'}) & Q(**{'age__gte': 18}))") + + self.assertEqual( + repr(Q(name='test') | Q(age__gte=18)), + "(Q(**{'name': 'test'}) | Q(**{'age__gte': 18}))") + def test_q_lists(self): """Ensure that Q objects query ListFields correctly. """