Merge branch 'master' of git://github.com/punteney/mongoengine

This commit is contained in:
Harry Marr 2010-01-31 13:11:20 +00:00
commit 79604180db
2 changed files with 42 additions and 2 deletions

View File

@ -14,10 +14,14 @@ REPR_OUTPUT_SIZE = 20
class InvalidQueryError(Exception): class InvalidQueryError(Exception):
pass pass
class OperationError(Exception): class OperationError(Exception):
pass pass
class MultipleObjectsReturned(Exception):
pass
class DoesNotExist(Exception):
pass
class Q(object): class Q(object):
@ -292,6 +296,21 @@ class QuerySet(object):
return mongo_query return mongo_query
def get(self, *q_objs, **query):
"""Retrieve the the matching object raising
'MultipleObjectsReturned' or 'DoesNotExist' exceptions
if multiple or no results are found.
"""
self.__call__(*q_objs, **query)
count = self.count()
if count == 1:
return self[0]
elif count > 1:
raise MultipleObjectsReturned
else:
raise DoesNotExist
def first(self): def first(self):
"""Retrieve the first object matching the query. """Retrieve the first object matching the query.
""" """

View File

@ -2,7 +2,7 @@ import unittest
import pymongo import pymongo
from datetime import datetime from datetime import datetime
from mongoengine.queryset import QuerySet from mongoengine.queryset import QuerySet, MultipleObjectsReturned, DoesNotExist
from mongoengine import * from mongoengine import *
@ -135,6 +135,27 @@ class QuerySetTest(unittest.TestCase):
person = self.Person.objects.with_id(person1.id) person = self.Person.objects.with_id(person1.id)
self.assertEqual(person.name, "User A") self.assertEqual(person.name, "User A")
def test_find_only_one(self):
"""Ensure that a query using find_one returns a valid result.
"""
# Try retrieving when no objects exists
self.assertRaises(DoesNotExist, self.Person.objects.get)
person1 = self.Person(name="User A", age=20)
person1.save()
person2 = self.Person(name="User B", age=30)
person2.save()
# Retrieve the first person from the database
self.assertRaises(MultipleObjectsReturned, self.Person.objects.get)
# Use a query to filter the people found to just person2
person = self.Person.objects.get(age=30)
self.assertEqual(person.name, "User B")
person = self.Person.objects.get(age__lt=30)
self.assertEqual(person.name, "User A")
def test_filter_chaining(self): def test_filter_chaining(self):
"""Ensure filters can be chained together. """Ensure filters can be chained together.
""" """