Fixed #4130 -- Added more self-explanatory error message when a typo is made in
a queryset field argument. We may need to fine-tune the error message based on experience down the line, but this stands as an improvement on its own. Thanks, Ned Batchelder. git-svn-id: http://code.djangoproject.com/svn/django/trunk@5133 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
0b2f9e89cd
commit
d943f5ae92
|
@ -853,6 +853,13 @@ def find_field(name, field_list, related_query):
|
||||||
return None
|
return None
|
||||||
return matches[0]
|
return matches[0]
|
||||||
|
|
||||||
|
def field_choices(field_list, related_query):
|
||||||
|
if related_query:
|
||||||
|
choices = [f.field.related_query_name() for f in field_list]
|
||||||
|
else:
|
||||||
|
choices = [f.name for f in field_list]
|
||||||
|
return choices
|
||||||
|
|
||||||
def lookup_inner(path, lookup_type, value, opts, table, column):
|
def lookup_inner(path, lookup_type, value, opts, table, column):
|
||||||
qn = backend.quote_name
|
qn = backend.quote_name
|
||||||
joins, where, params = SortedDict(), [], []
|
joins, where, params = SortedDict(), [], []
|
||||||
|
@ -937,7 +944,11 @@ def lookup_inner(path, lookup_type, value, opts, table, column):
|
||||||
except FieldFound: # Match found, loop has been shortcut.
|
except FieldFound: # Match found, loop has been shortcut.
|
||||||
pass
|
pass
|
||||||
else: # No match found.
|
else: # No match found.
|
||||||
raise TypeError, "Cannot resolve keyword '%s' into field" % name
|
choices = field_choices(current_opts.many_to_many, False) + \
|
||||||
|
field_choices(current_opts.get_all_related_many_to_many_objects(), True) + \
|
||||||
|
field_choices(current_opts.get_all_related_objects(), True) + \
|
||||||
|
field_choices(current_opts.fields, False)
|
||||||
|
raise TypeError, "Cannot resolve keyword '%s' into field, choices are: %s" % (name, ", ".join(choices))
|
||||||
|
|
||||||
# Check whether an intermediate join is required between current_table
|
# Check whether an intermediate join is required between current_table
|
||||||
# and new_table.
|
# and new_table.
|
||||||
|
|
|
@ -71,7 +71,7 @@ __test__ = {'API_TESTS':"""
|
||||||
>>> Author.objects.filter(firstname__exact='John')
|
>>> Author.objects.filter(firstname__exact='John')
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'firstname' into field
|
TypeError: Cannot resolve keyword 'firstname' into field, choices are: article, id, first_name, last_name
|
||||||
|
|
||||||
>>> a = Author.objects.get(last_name__exact='Smith')
|
>>> a = Author.objects.get(last_name__exact='Smith')
|
||||||
>>> a.first_name
|
>>> a.first_name
|
||||||
|
|
|
@ -223,11 +223,11 @@ DoesNotExist: Article matching query does not exist.
|
||||||
>>> Article.objects.filter(pub_date_year='2005').count()
|
>>> Article.objects.filter(pub_date_year='2005').count()
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'pub_date_year' into field
|
TypeError: Cannot resolve keyword 'pub_date_year' into field, choices are: id, headline, pub_date
|
||||||
|
|
||||||
>>> Article.objects.filter(headline__starts='Article')
|
>>> Article.objects.filter(headline__starts='Article')
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'headline__starts' into field
|
TypeError: Cannot resolve keyword 'headline__starts' into field, choices are: id, headline, pub_date
|
||||||
|
|
||||||
"""}
|
"""}
|
||||||
|
|
|
@ -174,13 +174,13 @@ False
|
||||||
>>> Article.objects.filter(reporter_id__exact=1)
|
>>> Article.objects.filter(reporter_id__exact=1)
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'reporter_id' into field
|
TypeError: Cannot resolve keyword 'reporter_id' into field, choices are: id, headline, pub_date, reporter
|
||||||
|
|
||||||
# You need to specify a comparison clause
|
# You need to specify a comparison clause
|
||||||
>>> Article.objects.filter(reporter_id=1)
|
>>> Article.objects.filter(reporter_id=1)
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'reporter_id' into field
|
TypeError: Cannot resolve keyword 'reporter_id' into field, choices are: id, headline, pub_date, reporter
|
||||||
|
|
||||||
# You can also instantiate an Article by passing
|
# You can also instantiate an Article by passing
|
||||||
# the Reporter's ID instead of a Reporter object.
|
# the Reporter's ID instead of a Reporter object.
|
||||||
|
|
|
@ -55,5 +55,5 @@ __test__ = {'API_TESTS':"""
|
||||||
>>> Poll.objects.get(choice__name__exact="This is the answer")
|
>>> Poll.objects.get(choice__name__exact="This is the answer")
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'choice' into field
|
TypeError: Cannot resolve keyword 'choice' into field, choices are: poll_choice, related_choice, id, question, creator
|
||||||
"""}
|
"""}
|
||||||
|
|
|
@ -32,7 +32,7 @@ __test__ = {'API_TESTS':"""
|
||||||
>>> Choice.objects.filter(foo__exact=None)
|
>>> Choice.objects.filter(foo__exact=None)
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
TypeError: Cannot resolve keyword 'foo' into field
|
TypeError: Cannot resolve keyword 'foo' into field, choices are: id, poll, choice
|
||||||
|
|
||||||
# Can't use None on anything other than __exact
|
# Can't use None on anything other than __exact
|
||||||
>>> Choice.objects.filter(id__gt=None)
|
>>> Choice.objects.filter(id__gt=None)
|
||||||
|
|
Loading…
Reference in New Issue