From 7d6e117f687462709e19fd8ce343ac3534d3a825 Mon Sep 17 00:00:00 2001 From: Florian Schlachter Date: Sun, 31 Jan 2010 01:11:37 +0100 Subject: [PATCH] added get-method to fetch exactly one document from the collection. catching pymongo's ObjectId-errors and raising mongoengine's ValidationError instead. --- mongoengine/base.py | 6 ++++-- mongoengine/queryset.py | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index 83fd34ee..8c038c8c 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -6,7 +6,6 @@ import pymongo class ValidationError(Exception): pass - class BaseField(object): """A base class for fields in a MongoDB document. Instances of this class may be added to subclasses of `Document` to define a document's schema. @@ -76,7 +75,10 @@ class ObjectIdField(BaseField): def to_mongo(self, value): if not isinstance(value, pymongo.objectid.ObjectId): - return pymongo.objectid.ObjectId(str(value)) + try: + return pymongo.objectid.ObjectId(str(value)) + except Exception, e: + raise ValidationError(e.message) return value def prepare_query_value(self, value): diff --git a/mongoengine/queryset.py b/mongoengine/queryset.py index bec6da2c..69bec002 100644 --- a/mongoengine/queryset.py +++ b/mongoengine/queryset.py @@ -10,6 +10,10 @@ __all__ = ['queryset_manager', 'Q', 'InvalidQueryError', # The maximum number of items to display in a QuerySet.__repr__ REPR_OUTPUT_SIZE = 20 +class DoesNotExist(Exception): + pass + + class MultipleObjectsReturned(Exception): pass @@ -313,7 +317,17 @@ class QuerySet(object): return dataset.first() else: raise MultipleObjectsReturned(u'%d items returned, instead of 1' % cnt) - + + def get(self, **kwargs): + dataset = self.filter(**kwargs) + cnt = dataset.count() + if cnt == 1: + return dataset.first() + elif cnt > 1: + raise MultipleObjectsReturned(u'%d items returned, instead of 1' % cnt) + else: + raise DoesNotExist('Document not found') + def first(self): """Retrieve the first object matching the query. """