DoesNotExist and MultipleObjectsReturned now contributes Document class
This commit is contained in:
parent
00c8d7e6f5
commit
8f4a579df9
@ -1,7 +1,9 @@
|
|||||||
from queryset import QuerySet, QuerySetManager
|
import sys
|
||||||
|
|
||||||
import pymongo
|
import pymongo
|
||||||
|
|
||||||
|
from queryset import QuerySet, QuerySetManager
|
||||||
|
from queryset import DoesNotExist, MultipleObjectsReturned
|
||||||
|
|
||||||
|
|
||||||
_document_registry = {}
|
_document_registry = {}
|
||||||
|
|
||||||
@ -167,7 +169,22 @@ class DocumentMetaclass(type):
|
|||||||
for field in new_class._fields.values():
|
for field in new_class._fields.values():
|
||||||
field.owner_document = new_class
|
field.owner_document = new_class
|
||||||
|
|
||||||
|
module = attrs.pop('__module__')
|
||||||
|
|
||||||
|
new_class.add_to_class('DoesNotExist', subclass_exception('DoesNotExist',
|
||||||
|
tuple(x.DoesNotExist
|
||||||
|
for k,x in superclasses.items())
|
||||||
|
or (DoesNotExist,), module))
|
||||||
|
|
||||||
|
new_class.add_to_class('MultipleObjectsReturned', subclass_exception('MultipleObjectsReturned',
|
||||||
|
tuple(x.MultipleObjectsReturned
|
||||||
|
for k,x in superclasses.items())
|
||||||
|
or (MultipleObjectsReturned,), module))
|
||||||
return new_class
|
return new_class
|
||||||
|
|
||||||
|
|
||||||
|
def add_to_class(self, name, value):
|
||||||
|
setattr(self, name, value)
|
||||||
|
|
||||||
|
|
||||||
class TopLevelDocumentMetaclass(DocumentMetaclass):
|
class TopLevelDocumentMetaclass(DocumentMetaclass):
|
||||||
@ -417,3 +434,11 @@ class BaseDocument(object):
|
|||||||
if self.id == other.id:
|
if self.id == other.id:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if sys.version_info < (2, 5):
|
||||||
|
# Prior to Python 2.5, Exception was an old-style class
|
||||||
|
def subclass_exception(name, parents, unused):
|
||||||
|
return types.ClassType(name, parents, {})
|
||||||
|
else:
|
||||||
|
def subclass_exception(name, parents, module):
|
||||||
|
return type(name, parents, {'__module__': module})
|
@ -352,9 +352,10 @@ class QuerySet(object):
|
|||||||
return self[0]
|
return self[0]
|
||||||
elif count > 1:
|
elif count > 1:
|
||||||
message = u'%d items returned, instead of 1' % count
|
message = u'%d items returned, instead of 1' % count
|
||||||
raise MultipleObjectsReturned(message)
|
raise self._document.MultipleObjectsReturned(message)
|
||||||
else:
|
else:
|
||||||
raise DoesNotExist('Document not found')
|
raise self._document.DoesNotExist("%s matching query does not exist."
|
||||||
|
% self._document._class_name)
|
||||||
|
|
||||||
def get_or_create(self, *q_objs, **query):
|
def get_or_create(self, *q_objs, **query):
|
||||||
"""Retreive unique object or create, if it doesn't exist. Raises
|
"""Retreive unique object or create, if it doesn't exist. Raises
|
||||||
@ -380,7 +381,7 @@ class QuerySet(object):
|
|||||||
return self.first()
|
return self.first()
|
||||||
else:
|
else:
|
||||||
message = u'%d items returned, instead of 1' % count
|
message = u'%d items returned, instead of 1' % count
|
||||||
raise MultipleObjectsReturned(message)
|
raise self._document.MultipleObjectsReturned(message)
|
||||||
|
|
||||||
def first(self):
|
def first(self):
|
||||||
"""Retrieve the first object matching the query.
|
"""Retrieve the first object matching the query.
|
||||||
|
@ -147,6 +147,7 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
# Try retrieving when no objects exists
|
# Try retrieving when no objects exists
|
||||||
self.assertRaises(DoesNotExist, self.Person.objects.get)
|
self.assertRaises(DoesNotExist, self.Person.objects.get)
|
||||||
|
self.assertRaises(self.Person.DoesNotExist, self.Person.objects.get)
|
||||||
|
|
||||||
person1 = self.Person(name="User A", age=20)
|
person1 = self.Person(name="User A", age=20)
|
||||||
person1.save()
|
person1.save()
|
||||||
@ -155,6 +156,7 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
|
|
||||||
# Retrieve the first person from the database
|
# Retrieve the first person from the database
|
||||||
self.assertRaises(MultipleObjectsReturned, self.Person.objects.get)
|
self.assertRaises(MultipleObjectsReturned, self.Person.objects.get)
|
||||||
|
self.assertRaises(self.Person.MultipleObjectsReturned, self.Person.objects.get)
|
||||||
|
|
||||||
# Use a query to filter the people found to just person2
|
# Use a query to filter the people found to just person2
|
||||||
person = self.Person.objects.get(age=30)
|
person = self.Person.objects.get(age=30)
|
||||||
@ -162,6 +164,9 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
|
|
||||||
person = self.Person.objects.get(age__lt=30)
|
person = self.Person.objects.get(age__lt=30)
|
||||||
self.assertEqual(person.name, "User A")
|
self.assertEqual(person.name, "User A")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_get_or_create(self):
|
def test_get_or_create(self):
|
||||||
"""Ensure that ``get_or_create`` returns one result or creates a new
|
"""Ensure that ``get_or_create`` returns one result or creates a new
|
||||||
@ -175,6 +180,8 @@ class QuerySetTest(unittest.TestCase):
|
|||||||
# Retrieve the first person from the database
|
# Retrieve the first person from the database
|
||||||
self.assertRaises(MultipleObjectsReturned,
|
self.assertRaises(MultipleObjectsReturned,
|
||||||
self.Person.objects.get_or_create)
|
self.Person.objects.get_or_create)
|
||||||
|
self.assertRaises(self.Person.MultipleObjectsReturned,
|
||||||
|
self.Person.objects.get_or_create)
|
||||||
|
|
||||||
# Use a query to filter the people found to just person2
|
# Use a query to filter the people found to just person2
|
||||||
person = self.Person.objects.get_or_create(age=30)
|
person = self.Person.objects.get_or_create(age=30)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user