summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-21 11:42:00 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-21 11:42:00 +0000
commit7388d016805c6b5416aca224b0964a8a63fa0a3f (patch)
tree9e71abfb620c659088b9d4ab115562480a22212f
parente401ff8ff83d2435428d4ac9a89b5dfc3e67d616 (diff)
queryset-refactor: Added support for cross-relation values() queries when
extra(select=...) was present (previously, it only worked without extra()). Also, better error reporting for values() queries with bad field names. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7343 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/query.py8
-rw-r--r--django/db/models/sql/query.py5
-rw-r--r--tests/modeltests/lookup/models.py2
3 files changed, 8 insertions, 7 deletions
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)}]