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. """