diff --git a/docs/changelog.rst b/docs/changelog.rst index 737f997c..ab34fb76 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.7.X ================= +- Fixed Q object merge edge case (MongoEngine/mongoengine#109) - Fixed reloading on sharded documents (hmarr/mongoengine#569) - Added NotUniqueError for duplicate keys (MongoEngine/mongoengine#62) - Added custom collection / sequence naming for SequenceFields (MongoEngine/mongoengine#92) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 8b627d83..f9494ebc 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -218,7 +218,7 @@ class QNode(object): def _combine(self, other, operation): """Combine this node with another node into a QCombination object. """ - if other.empty: + if getattr(other, 'empty', True): return self if self.empty: diff --git a/tests/test_queryset.py b/tests/test_queryset.py index 27205c40..15e2d9de 100644 --- a/tests/test_queryset.py +++ b/tests/test_queryset.py @@ -1347,6 +1347,21 @@ class QuerySetTest(unittest.TestCase): query = Foo.objects(Q(__raw__=q1) & Q(c=1))._query self.assertEqual(query, {'$or': [{'a': 1}, {'b': 1}], 'c': 1}) + def test_q_merge_queries_edge_case(self): + + class User(Document): + email = EmailField(required=False) + name = StringField() + + User.drop_collection() + pk = ObjectId() + User(email='example@example.com', pk=pk).save() + + self.assertEqual(1, User.objects.filter( + Q(email='example@example.com') | + Q(name='John Doe') + ).limit(2).filter(pk=pk).count()) + def test_exec_js_query(self): """Ensure that queries are properly formed for use in exec_js. """