mirror of
https://github.com/django/django.git
synced 2025-09-26 12:09:19 +00:00
Fixes #2737 -- Added code to allow None as a query value for __exact queries, raising an error otherwise. __exact=None is interpreted as the SQL 'value = NULL'. This fixes some minor problems with queries on unsaved objects with related object sets, and stops queries with a value of None being outright ignored (even if they reference an unknown attribute).
git-svn-id: http://code.djangoproject.com/svn/django/trunk@3902 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
73a6eb8ed0
commit
fbbbf8b9a1
4 changed files with 97 additions and 27 deletions
|
@ -707,30 +707,35 @@ def parse_lookup(kwarg_items, opts):
|
|||
joins, where, params = SortedDict(), [], []
|
||||
|
||||
for kwarg, value in kwarg_items:
|
||||
if value is not None:
|
||||
path = kwarg.split(LOOKUP_SEPARATOR)
|
||||
# Extract the last elements of the kwarg.
|
||||
# The very-last is the lookup_type (equals, like, etc).
|
||||
# The second-last is the table column on which the lookup_type is
|
||||
# to be performed. If this name is 'pk', it will be substituted with
|
||||
# the name of the primary key.
|
||||
# If there is only one part, or the last part is not a query
|
||||
# term, assume that the query is an __exact
|
||||
lookup_type = path.pop()
|
||||
if lookup_type == 'pk':
|
||||
lookup_type = 'exact'
|
||||
path.append(None)
|
||||
elif len(path) == 0 or lookup_type not in QUERY_TERMS:
|
||||
path.append(lookup_type)
|
||||
lookup_type = 'exact'
|
||||
path = kwarg.split(LOOKUP_SEPARATOR)
|
||||
# Extract the last elements of the kwarg.
|
||||
# The very-last is the lookup_type (equals, like, etc).
|
||||
# The second-last is the table column on which the lookup_type is
|
||||
# to be performed. If this name is 'pk', it will be substituted with
|
||||
# the name of the primary key.
|
||||
# If there is only one part, or the last part is not a query
|
||||
# term, assume that the query is an __exact
|
||||
lookup_type = path.pop()
|
||||
if lookup_type == 'pk':
|
||||
lookup_type = 'exact'
|
||||
path.append(None)
|
||||
elif len(path) == 0 or lookup_type not in QUERY_TERMS:
|
||||
path.append(lookup_type)
|
||||
lookup_type = 'exact'
|
||||
|
||||
if len(path) < 1:
|
||||
raise TypeError, "Cannot parse keyword query %r" % kwarg
|
||||
if len(path) < 1:
|
||||
raise TypeError, "Cannot parse keyword query %r" % kwarg
|
||||
|
||||
if value is None:
|
||||
# Interpret '__exact=None' as the sql '= NULL'; otherwise, reject
|
||||
# all uses of None as a query value.
|
||||
if lookup_type != 'exact':
|
||||
raise ValueError, "Cannot use None as a query value"
|
||||
|
||||
joins2, where2, params2 = lookup_inner(path, lookup_type, value, opts, opts.db_table, None)
|
||||
joins.update(joins2)
|
||||
where.extend(where2)
|
||||
params.extend(params2)
|
||||
joins2, where2, params2 = lookup_inner(path, lookup_type, value, opts, opts.db_table, None)
|
||||
joins.update(joins2)
|
||||
where.extend(where2)
|
||||
params.extend(params2)
|
||||
return joins, where, params
|
||||
|
||||
class FieldFound(Exception):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue