Commit cd7b54aa authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixes #2271 -- Added code to imply !__exact on any query argument that doesn't...

Fixes #2271 -- Added code to imply !__exact on any query argument that doesn't finish with a known query term.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@3248 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 4a324ba7
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -10,8 +10,20 @@ import re
if not hasattr(__builtins__, 'set'):
    from sets import Set as set

# The string constant used to separate query parts
LOOKUP_SEPARATOR = '__'

# The list of valid query types 
QUERY_TERMS=(
    'exact', 'iexact',
    'contains', 'icontains',
    'gt', 'gte', 'lt', 'lte',
    'in',
    'startswith', 'istartswith', 'endswith', 'iendswith',
    'range', 'year', 'month', 'day',
    'isnull'
)

# Size of each "chunk" for get_iterator calls.
# Larger values are slightly faster at the expense of more storage space.
GET_ITERATOR_CHUNK_SIZE = 100
@@ -710,12 +722,13 @@ def parse_lookup(kwarg_items, opts):
            #     if we find "pk", make the clause "exact', and insert
            #     a dummy name of None, which we will replace when
            #     we know which table column to grab as the primary key.
            # 2)  If there is only one part, assume it to be an __exact
            # 2)  If there is only one part, or the last part is not a query
            #     term, assume that the query is an __exact            
            clause = path.pop()
            if clause == 'pk':
                clause = 'exact'
                path.append(None)
            elif len(path) == 0:
            elif len(path) == 0 or clause not in QUERY_TERMS:
                path.append(clause)
                clause = 'exact'

+8 −0
Original line number Diff line number Diff line
@@ -136,6 +136,10 @@ False
>>> Article.objects.filter(reporter__first_name__exact='John')
[<Article: John's second story>, <Article: This is a test>]

# Check that implied __exact also works
>>> Article.objects.filter(reporter__first_name='John')
[<Article: John's second story>, <Article: This is a test>]

# Query twice over the related field.
>>> Article.objects.filter(reporter__first_name__exact='John', reporter__last_name__exact='Smith')
[<Article: John's second story>, <Article: This is a test>]
@@ -237,6 +241,10 @@ TypeError: Cannot resolve keyword 'reporter_id' into field
>>> Reporter.objects.filter(article__reporter__exact=r).distinct()
[<Reporter: John Smith>]

# Check that implied __exact also works
>>> Reporter.objects.filter(article__reporter=r).distinct()
[<Reporter: John Smith>]

# If you delete a reporter, his articles will be deleted.
>>> Article.objects.all()
[<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>, <Article: This is a test>, <Article: This is a test>]