diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2012-07-17 12:24:56 +0300 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2012-07-17 12:49:46 +0300 |
| commit | fcad6c48f07bdc6346c065849a87f0f02afb6f94 (patch) | |
| tree | d4a4f10a8e5910f9f03910938da2be4a267771e0 | |
| parent | aeda55e6bffc3cfbf53698af398a19c1a0f02d46 (diff) | |
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.
| -rw-r--r-- | django/db/models/sql/query.py | 13 | ||||
| -rw-r--r-- | tests/modeltests/many_to_one/tests.py | 14 |
2 files changed, 22 insertions, 5 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 8fbba3dbc9..118bc1e14f 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1655,10 +1655,15 @@ class Query(object): except MultiJoin: raise FieldError("Invalid field name: '%s'" % name) except FieldError: - names = opts.get_all_field_names() + self.extra.keys() + self.aggregate_select.keys() - names.sort() - raise FieldError("Cannot resolve keyword %r into field. " - "Choices are: %s" % (name, ", ".join(names))) + if name.find(LOOKUP_SEP) != -1: + # For lookups spanning over relationships, show the error + # from the model on which the lookup failed. + 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() def add_ordering(self, *ordering): diff --git a/tests/modeltests/many_to_one/tests.py b/tests/modeltests/many_to_one/tests.py index 257025583b..fd849df051 100644 --- a/tests/modeltests/many_to_one/tests.py +++ b/tests/modeltests/many_to_one/tests.py @@ -3,7 +3,7 @@ from __future__ import absolute_import from copy import deepcopy from datetime import datetime -from django.core.exceptions import MultipleObjectsReturned +from django.core.exceptions import MultipleObjectsReturned, FieldError from django.test import TestCase from django.utils.translation import ugettext_lazy @@ -424,3 +424,15 @@ class ManyToOneTests(TestCase): notlazy = unicode(lazy) article = reporter.article_set.get() 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') |
