From 268908b3b271a58090792a3d0ea10e63883caf15 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Sat, 8 Oct 2011 08:06:23 -0700 Subject: [PATCH] Improvements to .get() efficiency Closes #307 and #290 --- AUTHORS | 1 + docs/changelog.rst | 1 + mongoengine/queryset.py | 16 +++++++++------- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index 8af18138..f3f07436 100644 --- a/AUTHORS +++ b/AUTHORS @@ -69,3 +69,4 @@ that much better: * John Arnfield * grubberr * Paul Aliagas + * Paul Cunnane diff --git a/docs/changelog.rst b/docs/changelog.rst index c458ec65..41432b39 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,7 @@ Changelog Changes in dev ============== +- Improved efficiency of .get() - Updated ComplexFields so if required they won't accept empty lists / dicts - Added spec file for rpm-based distributions - Fixed ListField so it doesnt accept strings diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index 2b44dc4b..e3d2b473 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -728,15 +728,17 @@ class QuerySet(object): .. versionadded:: 0.3 """ self.__call__(*q_objs, **query) - count = self.count() - if count == 1: - return self[0] - elif count > 1: - message = u'%d items returned, instead of 1' % count - raise self._document.MultipleObjectsReturned(message) - else: + try: + result1 = self[0] + except IndexError: raise self._document.DoesNotExist("%s matching query does not exist." % self._document._class_name) + try: + result2 = self[1] + except IndexError: + return result1 + message = u'%d items returned, instead of 1' % self.count() + raise self._document.MultipleObjectsReturned(message) def get_or_create(self, write_options=None, *q_objs, **query): """Retrieve unique object or create, if it doesn't exist. Returns a tuple of