From cfc394963fc001ca86034e5bfad4a50713912445 Mon Sep 17 00:00:00 2001 From: blackbrrr Date: Tue, 12 Jan 2010 12:16:15 -0600 Subject: [PATCH] added queryset chaining via 'filter' method. test included. --- mongoengine/base.py | 3 ++- mongoengine/queryset.py | 3 +++ tests/queryset.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index 76a2c0e9..bf813670 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -19,6 +19,7 @@ class BaseField(object): self.default = default self.unique = bool(unique or unique_with) self.unique_with = unique_with + self._loaded = [] def __get__(self, instance, owner): """Descriptor for retrieving a value from a field in a document. Do @@ -68,7 +69,7 @@ class ObjectIdField(BaseField): """ def to_python(self, value): - return str(value) + return unicode(value) def to_mongo(self, value): if not isinstance(value, pymongo.objectid.ObjectId): diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 39cef283..5dad6617 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -62,6 +62,9 @@ class QuerySet(object): query = QuerySet._transform_query(_doc_cls=self._document, **query) self._query.update(query) return self + + def filter(self, **query): + return self.__call__(**query) @property def _collection(self): diff --git a/tests/queryset.py b/tests/queryset.py index 698ada9c..8d039712 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -131,6 +131,42 @@ class QuerySetTest(unittest.TestCase): person = self.Person.objects.with_id(person1.id) self.assertEqual(person.name, "User A") + def test_filter_chaining(self): + """Ensure filters can be chained together. + """ + from datetime import datetime + + class BlogPost(Document): + title = StringField() + is_published = BooleanField() + published_date = DateTimeField() + + @queryset_manager + def published(queryset): + return queryset(is_published=True) + + blog_post_1 = BlogPost(title="Blog Post #1", + is_published = True, + published_date=datetime(2010, 1, 5, 0, 0 ,0)) + blog_post_2 = BlogPost(title="Blog Post #2", + is_published = True, + published_date=datetime(2010, 1, 6, 0, 0 ,0)) + blog_post_3 = BlogPost(title="Blog Post #3", + is_published = True, + published_date=datetime(2010, 1, 7, 0, 0 ,0)) + + blog_post_1.save() + blog_post_2.save() + blog_post_3.save() + + # find all published blog posts before 2010-01-07 + published_posts = BlogPost.published() + published_posts = published_posts.filter( + published_date__lt=datetime(2010, 1, 7, 0, 0 ,0)) + self.assertEqual(published_posts.count(), 2) + + BlogPost.drop_collection() + def test_ordering(self): """Ensure default ordering is applied and can be overridden. """