Fixed #17497 -- Corrected FieldError message in add_fields()

The erroneous message was user visible in values_list() calls.

Thanks to ojii for report and review, and to antoviaque for the patch.
This commit is contained in:
Anssi Kääriäinen 2012-07-17 12:24:56 +03:00
parent aeda55e6bf
commit fcad6c48f0
2 changed files with 22 additions and 5 deletions

View File

@ -1655,10 +1655,15 @@ class Query(object):
except MultiJoin: except MultiJoin:
raise FieldError("Invalid field name: '%s'" % name) raise FieldError("Invalid field name: '%s'" % name)
except FieldError: except FieldError:
names = opts.get_all_field_names() + self.extra.keys() + self.aggregate_select.keys() if name.find(LOOKUP_SEP) != -1:
names.sort() # For lookups spanning over relationships, show the error
raise FieldError("Cannot resolve keyword %r into field. " # from the model on which the lookup failed.
"Choices are: %s" % (name, ", ".join(names))) raise
else:
names = sorted(opts.get_all_field_names() + self.extra.keys()
+ self.aggregate_select.keys())
raise FieldError("Cannot resolve keyword %r into field. "
"Choices are: %s" % (name, ", ".join(names)))
self.remove_inherited_models() self.remove_inherited_models()
def add_ordering(self, *ordering): def add_ordering(self, *ordering):

View File

@ -3,7 +3,7 @@ from __future__ import absolute_import
from copy import deepcopy from copy import deepcopy
from datetime import datetime from datetime import datetime
from django.core.exceptions import MultipleObjectsReturned from django.core.exceptions import MultipleObjectsReturned, FieldError
from django.test import TestCase from django.test import TestCase
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
@ -424,3 +424,15 @@ class ManyToOneTests(TestCase):
notlazy = unicode(lazy) notlazy = unicode(lazy)
article = reporter.article_set.get() article = reporter.article_set.get()
self.assertEqual(article.headline, notlazy) self.assertEqual(article.headline, notlazy)
def test_values_list_exception(self):
expected_message = "Cannot resolve keyword 'notafield' into field. Choices are: %s"
self.assertRaisesMessage(FieldError,
expected_message % ', '.join(Reporter._meta.get_all_field_names()),
Article.objects.values_list,
'reporter__notafield')
self.assertRaisesMessage(FieldError,
expected_message % ', '.join(['EXTRA',] + Article._meta.get_all_field_names()),
Article.objects.extra(select={'EXTRA': 'EXTRA_SELECT'}).values_list,
'notafield')