From 5e6a6aa886647b3268ed0e07a307772b9724fd95 Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Fri, 18 Dec 2009 18:41:44 +0000 Subject: [PATCH] Added sort method to QuerySet --- mongoengine/document.py | 3 ++- mongoengine/queryset.py | 16 ++++++++++++++++ tests/queryset.py | 19 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/mongoengine/document.py b/mongoengine/document.py index 5bb313ea..99c98cd4 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -25,7 +25,8 @@ class Document(BaseDocument): """Delete the document from the database. This will only take effect if the document has been previously saved. """ - self.objects._collection.remove(self.id) + object_id = self._fields['id'].to_mongo(self.id) + self.__class__.objects(_id=object_id).delete() @classmethod def drop_collection(cls): diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index c5997cf6..abe52a50 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -97,6 +97,22 @@ class QuerySet(object): """ self._collection.remove(self._query) + def sort(self, *keys): + """Sort the QuerySet by the keys. The order may be specified by + prepending each of the keys by a + or a -. Ascending order is assumed. + """ + key_list = [] + for key in keys: + direction = pymongo.ASCENDING + if key[0] == '-': + direction = pymongo.DESCENDING + if key[0] in ('-', '+'): + key = key[1:] + key_list.append((key, direction)) + + self._cursor.sort(key_list) + return self + def __iter__(self): return self diff --git a/tests/queryset.py b/tests/queryset.py index 0ba1bb16..39b14fc1 100644 --- a/tests/queryset.py +++ b/tests/queryset.py @@ -137,6 +137,25 @@ class QuerySetTest(unittest.TestCase): self.Person.objects.delete() self.assertEqual(self.Person.objects.count(), 0) + def test_sort(self): + """Ensure that QuerySets may be sorted. + """ + self.Person(name="User A", age=20).save() + self.Person(name="User B", age=40).save() + self.Person(name="User C", age=30).save() + + names = [p.name for p in self.Person.objects.sort('-age')] + self.assertEqual(names, ['User B', 'User C', 'User A']) + + names = [p.name for p in self.Person.objects.sort('+age')] + self.assertEqual(names, ['User A', 'User C', 'User B']) + + names = [p.name for p in self.Person.objects.sort('age')] + self.assertEqual(names, ['User A', 'User C', 'User B']) + + ages = [p.age for p in self.Person.objects.sort('-name')] + self.assertEqual(ages, [30, 40, 20]) + def tearDown(self): self.Person.drop_collection()