summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-15 01:59:06 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-03-15 01:59:06 +0000
commita81813fb4aec2e25850780c3846ad9743bf460ed (patch)
tree2d7918b0f47c46e864179ce8ad598b0cb860a3af
parent2f45deb72cf815cf78d5221a284918a5ef13e351 (diff)
queryset-refactor: Fixed the "in" lookup type when using tuples.
Accidentally broken in r7170. Fixed #6772. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7244 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/fields/related.py3
-rw-r--r--django/db/models/query_utils.py8
-rw-r--r--django/db/models/sql/where.py5
-rw-r--r--tests/modeltests/or_lookups/models.py2
4 files changed, 15 insertions, 3 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 818c8a9d7c..1bc9b87ef8 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -2,6 +2,7 @@ from django.db import connection, transaction
from django.db.models import signals, get_model
from django.db.models.fields import AutoField, Field, IntegerField, PositiveIntegerField, PositiveSmallIntegerField, get_ul_class
from django.db.models.related import RelatedObject
+from django.db.models.query_utils import QueryWrapper
from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy, string_concat, ungettext, ugettext as _
from django.utils.functional import curry
@@ -138,7 +139,7 @@ class RelatedField(object):
if hasattr(value, 'as_sql'):
sql, params = value.as_sql()
- return ('(%s)' % sql), params
+ return QueryWrapper(('(%s)' % sql), params)
if lookup_type == 'exact':
return [pk_trace(value)]
if lookup_type == 'in':
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index 426811be89..003628ad94 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -15,6 +15,14 @@ class EmptyResultSet(Exception):
"""
pass
+class QueryWrapper(object):
+ """
+ A type that indicates the contents are an SQL fragment and the associate
+ parameters. Can be used to pass opaque data to a where-clause, for example.
+ """
+ def __init__(self, sql, params):
+ self.data = sql, params
+
class Q(tree.Node):
"""
Encapsulates filters as objects that can then be combined logically (using
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index e1c0a88121..f0d2786a49 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -6,6 +6,7 @@ import datetime
from django.utils import tree
from django.db import connection
from django.db.models.fields import Field
+from django.db.models.query_utils import QueryWrapper
from datastructures import EmptyResultSet, FullResultSet
# Connection types
@@ -110,8 +111,8 @@ class WhereNode(tree.Node):
params = field.get_db_prep_lookup(lookup_type, value)
else:
params = Field().get_db_prep_lookup(lookup_type, value)
- if isinstance(params, tuple):
- extra, params = params
+ if isinstance(params, QueryWrapper):
+ extra, params = params.data
else:
extra = ''
diff --git a/tests/modeltests/or_lookups/models.py b/tests/modeltests/or_lookups/models.py
index b3500f27e7..38339c0685 100644
--- a/tests/modeltests/or_lookups/models.py
+++ b/tests/modeltests/or_lookups/models.py
@@ -70,6 +70,8 @@ __test__ = {'API_TESTS':"""
# You could also use "in" to accomplish the same as above.
>>> Article.objects.filter(pk__in=[1,2,3])
[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+>>> Article.objects.filter(pk__in=(1,2,3))
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
>>> Article.objects.filter(pk__in=[1,2,3,4])
[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]