From 3f301f6b0f5c56b731a37ae82442a5e90315972e Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Tue, 16 Aug 2011 10:32:21 +0100 Subject: [PATCH] Finishing touches to where implementation - thanks to dcrosta Refs #242 --- AUTHORS | 1 + docs/changelog.rst | 1 + mongoengine/fields.py | 4 ++-- mongoengine/queryset.py | 4 ++++ tests/queryset.py | 13 +++++++++++++ 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index b13af2b0..fbf78cf6 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,3 +5,4 @@ Florian Schlachter Steve Challis Ross Lawley Wilson JĂșnior +Dan Crosta https://github.com/dcrosta diff --git a/docs/changelog.rst b/docs/changelog.rst index f3a4b944..87247d57 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in dev ============== +- Added where() - filter to allowing users to specify query expressions as Javascript - Added SequenceField - for creating sequential counters - Added update() convenience method to a document - Added cascading saves - so changes to Referenced documents are saved on .save() diff --git a/mongoengine/fields.py b/mongoengine/fields.py index b2f1e2a2..619b8c60 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -620,7 +620,7 @@ class GenericReferenceField(BaseField): """A reference to *any* :class:`~mongoengine.document.Document` subclass that will be automatically dereferenced on access (lazily). - note: Any documents used as a generic reference must be registered in the + ..note :: Any documents used as a generic reference must be registered in the document registry. Importing the model will automatically register it. .. versionadded:: 0.3 @@ -925,7 +925,7 @@ class SequenceField(IntField): return value def __set__(self, instance, value): - + if value is None and instance._initialised: value = self.generate_new_value() diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index c8945142..303fcc1b 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -1401,6 +1401,10 @@ class QuerySet(object): """Filter ``QuerySet`` results with a ``$where`` clause (a Javascript expression). Performs automatic field name substitution like :meth:`mongoengine.queryset.Queryset.exec_js`. + + .. note:: When using this mode of query, the database will call your + function, or evaluate your predicate clause, for each object + in the collection. """ where_clause = self._sub_js_fields(where_clause) self._where_clause = where_clause diff --git a/tests/queryset.py b/tests/queryset.py index ce64a004..6ae1c10f 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -2531,6 +2531,19 @@ class QuerySetTest(unittest.TestCase): self.assertEqual(1, len(results)) self.assertTrue(a in results) + query = IntPair.objects.where('function() { return this[~fielda] >= this[~fieldb] }') + self.assertEqual('function() { return this["fielda"] >= this["fieldb"] }', query._where_clause) + results = list(query) + self.assertEqual(2, len(results)) + self.assertTrue(a in results) + self.assertTrue(c in results) + + def invalid_where(): + list(IntPair.objects.where(fielda__gte=3)) + + self.assertRaises(TypeError, invalid_where) + + class QTest(unittest.TestCase): def setUp(self):