summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/datastructures.py3
-rw-r--r--django/db/models/sql/query.py29
2 files changed, 16 insertions, 16 deletions
diff --git a/django/db/models/sql/datastructures.py b/django/db/models/sql/datastructures.py
index 421c3cd860..634edf2477 100644
--- a/django/db/models/sql/datastructures.py
+++ b/django/db/models/sql/datastructures.py
@@ -24,6 +24,9 @@ class Col(object):
def get_lookup(self, name):
return self.output_type.get_lookup(name)
+ def get_transform(self, name):
+ return self.output_type.get_transform(name)
+
def prepare(self):
return self
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 7bfdceb183..25ebe5598e 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1088,24 +1088,21 @@ class Query(object):
lookups = lookups[:]
while lookups:
lookup = lookups[0]
- next = lhs.get_lookup(lookup)
+ if len(lookups) == 1:
+ final_lookup = lhs.get_lookup(lookup)
+ if final_lookup:
+ return final_lookup(lhs, rhs)
+ # We didn't find a lookup, so we are going to try get_transform
+ # + get_lookup('exact').
+ lookups.append('exact')
+ next = lhs.get_transform(lookup)
if next:
- if len(lookups) == 1:
- # This was the last lookup, so return value lookup.
- if issubclass(next, Transform):
- lookups.append('exact')
- lhs = next(lhs, lookups)
- else:
- return next(lhs, rhs)
- else:
- lhs = next(lhs, lookups)
- # A field's get_lookup() can return None to opt for backwards
- # compatibility path.
- elif len(lookups) > 2:
- raise FieldError(
- "Unsupported lookup for field '%s'" % lhs.output_type.name)
+ lhs = next(lhs, lookups)
else:
- return None
+ raise FieldError(
+ "Unsupported lookup '%s' for %s or join on the field not "
+ "permitted." %
+ (lookup, lhs.output_type.__class__.__name__))
lookups = lookups[1:]
def build_filter(self, filter_expr, branch_negated=False, current_negated=False,