Merge remote branch 'hmarr/master'
Conflicts: mongoengine/queryset.py
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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.
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user