diff --git a/django/db/models/query.py b/django/db/models/query.py index 7376d13715..1cc3bbeec4 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -508,15 +508,11 @@ class ValuesQuerySet(QuerySet): field_names = list(self._fields) else: field_names = [] - names = set(self.model._meta.get_all_field_names()) for f in self._fields: - if f in names: - field_names.append(f) - elif self.query.extra_select.has_key(f): + if self.query.extra_select.has_key(f): self.extra_names.append(f) else: - raise FieldDoesNotExist('%s has no field named %r' - % (self.model._meta.object_name, f)) + field_names.append(f) else: # Default to all fields. field_names = [f.attname for f in self.model._meta.fields] diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 6a68448bf1..370ef357b0 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1191,6 +1191,11 @@ class Query(object): self.select.append((final_alias, col)) except MultiJoin: raise FieldError("Invalid field name: '%s'" % name) + except FieldError: + names = opts.get_all_field_names() + self.extra_select.keys() + names.sort() + raise FieldError("Cannot resolve keyword %r into field. " + "Choices are: %s" % (name, ", ".join(names))) def add_ordering(self, *ordering): """ diff --git a/tests/modeltests/lookup/models.py b/tests/modeltests/lookup/models.py index 5cff48ac51..a18be968aa 100644 --- a/tests/modeltests/lookup/models.py +++ b/tests/modeltests/lookup/models.py @@ -162,7 +162,7 @@ True >>> Article.objects.extra(select={'id_plus_one': 'id + 1'}).values('id', 'id_plus_two') Traceback (most recent call last): ... -FieldDoesNotExist: Article has no field named 'id_plus_two' +FieldError: Cannot resolve keyword 'id_plus_two' into field. Choices are: headline, id, id_plus_one, pub_date # If you don't specify field names to values(), all are returned. >>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]