Merge remote branch 'hmarr/master'

Conflicts:
	mongoengine/queryset.py
This commit is contained in:
Florian Schlachter
2010-01-31 17:43:56 +01:00
5 changed files with 130 additions and 35 deletions

View File

@@ -352,19 +352,15 @@ class BaseDocument(object):
if value is not None:
data[field.name] = field.to_mongo(value)
# Only add _cls and _types if allow_inheritance is not False
#if not (hasattr(self, '_meta') and
# self._meta.get('allow_inheritance', True) == False):
ah = True
if hasattr(self, '_meta'):
ah = self._meta.get('allow_inheritance', True)
if ah:
if not (hasattr(self, '_meta') and
self._meta.get('allow_inheritance', True) == False):
data['_cls'] = self._class_name
data['_types'] = self._superclasses.keys() + [self._class_name]
return data
@classmethod
def _from_son(cls, son):
"""Create an instance of a Document (subclass) from a PyMongo SOM.
"""Create an instance of a Document (subclass) from a PyMongo SON.
"""
# get the class name from the document, falling back to the given
# class if unavailable

View File

@@ -10,6 +10,7 @@ __all__ = ['queryset_manager', 'Q', 'InvalidQueryError',
# The maximum number of items to display in a QuerySet.__repr__
REPR_OUTPUT_SIZE = 20
class DoesNotExist(Exception):
pass
@@ -299,37 +300,46 @@ class QuerySet(object):
return mongo_query
def get_or_create(self, **kwargs):
"""Retreive unique object or create, if it doesn't exist
def get(self, *q_objs, **query):
"""Retrieve the the matching object raising
:class:`~mongoengine.queryset.MultipleObjectsReturned` or
:class:`~mongoengine.queryset.DoesNotExist` exceptions if multiple or
no results are found.
"""
defaults = kwargs.get('defaults', {})
if kwargs.has_key('defaults'):
del kwargs['defaults']
dataset = self.filter(**kwargs)
cnt = dataset.count()
if cnt == 0:
kwargs.update(defaults)
doc = self._document(**kwargs)
doc.save()
return doc
elif cnt == 1:
return dataset.first()
else:
raise MultipleObjectsReturned(u'%d items returned, expected exactly one' % cnt)
def get(self, **kwargs):
"""Retreive exactly one document. Raise DoesNotExist if it's not found.
"""
dataset = self.filter(**kwargs)
cnt = dataset.count()
if cnt == 1:
return dataset.first()
elif cnt > 1:
raise MultipleObjectsReturned(u'%d items returned, expected exactly one' % cnt)
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 MultipleObjectsReturned(message)
else:
raise DoesNotExist('Document not found')
def get_or_create(self, *q_objs, **query):
"""Retreive unique object or create, if it doesn't exist. Raises
:class:`~mongoengine.queryset.MultipleObjectsReturned` if multiple
results are found. A new document will be created if the document
doesn't exists; a dictionary of default values for the new document
may be provided as a keyword argument called :attr:`defaults`.
"""
defaults = query.get('defaults', {})
if query.has_key('defaults'):
del query['defaults']
self.__call__(*q_objs, **query)
count = self.count()
if count == 0:
query.update(defaults)
doc = self._document(**query)
doc.save()
return doc
elif count == 1:
return self.first()
else:
message = u'%d items returned, instead of 1' % count
raise MultipleObjectsReturned(message)
def first(self):
"""Retrieve the first object matching the query.
"""