From eb002e7892793fb9f593efaed8d3ea52a2bfc96c Mon Sep 17 00:00:00 2001 From: dizballanze Date: Sat, 17 Feb 2018 11:27:46 +0300 Subject: Fixed #29135 -- Prevented get_object/list_or_404() from hiding AttributeError raised by QuerySet filtering. --- django/shortcuts.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'django') diff --git a/django/shortcuts.py b/django/shortcuts.py index 6b35e64f4e..582aee05e5 100644 --- a/django/shortcuts.py +++ b/django/shortcuts.py @@ -83,14 +83,14 @@ def get_object_or_404(klass, *args, **kwargs): one object is found. """ queryset = _get_queryset(klass) - try: - return queryset.get(*args, **kwargs) - except AttributeError: + if not hasattr(queryset, 'get'): klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__ raise ValueError( "First argument to get_object_or_404() must be a Model, Manager, " "or QuerySet, not '%s'." % klass__name ) + try: + return queryset.get(*args, **kwargs) except queryset.model.DoesNotExist: raise Http404('No %s matches the given query.' % queryset.model._meta.object_name) @@ -104,14 +104,13 @@ def get_list_or_404(klass, *args, **kwargs): arguments and keyword arguments are used in the filter() query. """ queryset = _get_queryset(klass) - try: - obj_list = list(queryset.filter(*args, **kwargs)) - except AttributeError: + if not hasattr(queryset, 'filter'): klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__ raise ValueError( "First argument to get_list_or_404() must be a Model, Manager, or " "QuerySet, not '%s'." % klass__name ) + obj_list = list(queryset.filter(*args, **kwargs)) if not obj_list: raise Http404('No %s matches the given query.' % queryset.model._meta.object_name) return obj_list -- cgit v1.3