Skip to content

Commit 805c364

Browse files
committed
Fixed #3511 -- Changed QuerySet.get() to return a MultipleObjectsReturned exception, rather than an assertion error. Thanks, Gary Wilson and cheeming.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6838 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 5e5768a commit 805c364

File tree

6 files changed

+13
-6
lines changed

6 files changed

+13
-6
lines changed

django/core/exceptions.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ class ObjectDoesNotExist(Exception):
44
"The requested object does not exist"
55
silent_variable_failure = True
66

7+
class MultipleObjectsReturned(Exception):
8+
"The query returned multiple objects when only one was expected."
9+
pass
10+
711
class SuspiciousOperation(Exception):
812
"The user did something suspicious"
913
pass

django/db/models/base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import django.db.models.manipulators
22
import django.db.models.manager
33
from django.core import validators
4-
from django.core.exceptions import ObjectDoesNotExist
4+
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
55
from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist
66
from django.db.models.fields.related import OneToOneRel, ManyToOneRel
77
from django.db.models.query import delete_objects
@@ -35,6 +35,8 @@ def __new__(cls, name, bases, attrs):
3535
new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})
3636
new_class.add_to_class('_meta', Options(attrs.pop('Meta', None)))
3737
new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))
38+
new_class.add_to_class('MultipleObjectsReturned',
39+
types.ClassType('MultipleObjectsReturned', (MultipleObjectsReturned, ), {}))
3840

3941
# Build complete list of parents
4042
for base in bases:

django/db/models/query.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ def get(self, *args, **kwargs):
261261
obj_list = list(clone)
262262
if len(obj_list) < 1:
263263
raise self.model.DoesNotExist, "%s matching query does not exist." % self.model._meta.object_name
264-
assert len(obj_list) == 1, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.model._meta.object_name, len(obj_list), kwargs)
264+
elif len(obj_list) > 1:
265+
raise self.model.MultipleObjectsReturned, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.model._meta.object_name, len(obj_list), kwargs)
265266
return obj_list[0]
266267

267268
def create(self, **kwargs):

django/shortcuts/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def get_object_or_404(klass, *args, **kwargs):
3838
klass may be a Model, Manager, or QuerySet object. All other passed
3939
arguments and keyword arguments are used in the get() query.
4040
41-
Note: Like with get(), an AssertionError will be raised if more than one
41+
Note: Like with get(), an MultipleObjectsReturned will be raised if more than one
4242
object is found.
4343
"""
4444
queryset = _get_queryset(klass)

docs/shortcuts.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ This example is equivalent to::
9898
except MyModel.DoesNotExist:
9999
raise Http404
100100

101-
Note: As with ``get()``, an ``AssertionError`` will be raised if more than
102-
one object is found.
101+
Note: As with ``get()``, an ``MultipleObjectsReturned`` exception will be
102+
raised if more than one object is found.
103103

104104
.. _get(): ../db-api/#get-kwargs
105105

tests/modeltests/get_object_or_404/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def __unicode__(self):
7878
>>> get_object_or_404(Author.objects.all())
7979
Traceback (most recent call last):
8080
...
81-
AssertionError: get() returned more than one Author -- it returned ...! Lookup parameters were {}
81+
MultipleObjectsReturned: get() returned more than one Author -- it returned ...! Lookup parameters were {}
8282
8383
# Using an EmptyQuerySet raises a Http404 error.
8484
>>> get_object_or_404(Article.objects.none(), title__contains="Run")

0 commit comments

Comments
 (0)