From a192029901c6c21b3cc949a6221a1090083ebf86 Mon Sep 17 00:00:00 2001 From: Aleksandr Sorokoumov Date: Sat, 16 Mar 2013 16:47:22 +0100 Subject: [PATCH 1/3] ReferenceField query chaining bug fixed. --- mongoengine/queryset.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index bff05fcf..6c61ab9e 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -367,6 +367,10 @@ class QuerySet(object): self._skip = None self._hint = -1 # Using -1 as None is a valid value for hint + def __deepcopy__(self, memo): + """Essential for chained queries with ReferenceFields involved""" + return self.clone() + def clone(self): """Creates a copy of the current :class:`~mongoengine.queryset.QuerySet` @@ -814,7 +818,6 @@ class QuerySet(object): mongo_query['$and'].append(value) else: mongo_query['$and'] = value - return mongo_query def get(self, *q_objs, **query): From f7515cfca80d870728ae5f03535dcedcd2a6a5b1 Mon Sep 17 00:00:00 2001 From: Aleksandr Sorokoumov Date: Mon, 18 Mar 2013 12:22:55 +0100 Subject: [PATCH 2/3] add myself to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 82a1dfa4..fe62026d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -128,3 +128,4 @@ that much better: * Peter Teichman * Jakub Kot * Jorge Bastida + * Aleksandr Sorokoumov \ No newline at end of file From 165bea5bb97f24c4b06fedfe38ebb3d925052eaa Mon Sep 17 00:00:00 2001 From: Aleksandr Sorokoumov Date: Mon, 18 Mar 2013 12:32:49 +0100 Subject: [PATCH 3/3] QuerySet chaining test was supplemented with ReferenceField chaining test --- tests/test_queryset.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/tests/test_queryset.py b/tests/test_queryset.py index 5234cea2..43bb70bc 100644 --- a/tests/test_queryset.py +++ b/tests/test_queryset.py @@ -232,28 +232,33 @@ class QuerySetTest(unittest.TestCase): def test_chaining(self): class A(Document): - pass + s = StringField() class B(Document): - a = ReferenceField(A) + ref = ReferenceField(A) + boolfield = BooleanField(default=False) A.drop_collection() B.drop_collection() - a1 = A().save() - a2 = A().save() + a1 = A(s="test1").save() + a2 = A(s="test2").save() - B(a=a1).save() + B(ref=a1, boolfield=True).save() # Works - q1 = B.objects.filter(a__in=[a1, a2], a=a1)._query + q1 = B.objects.filter(ref__in=[a1, a2], ref=a1)._query # Doesn't work - q2 = B.objects.filter(a__in=[a1, a2]) - q2 = q2.filter(a=a1)._query - + q2 = B.objects.filter(ref__in=[a1, a2]) + q2 = q2.filter(ref=a1)._query self.assertEqual(q1, q2) + a_objects = A.objects(s='test1') + query = B.objects(ref__in=a_objects) + query = query.filter(boolfield=True) + self.assertEquals(query.count(), 1) + def test_update_write_options(self): """Test that passing write_options works"""