Kaydet (Commit) 0ec134e3 authored tarafından Sergey Fedoseev's avatar Sergey Fedoseev Kaydeden (comit) Tim Graham

Simplified calculation of used joins in Query.build_filter().

üst 68f0bcb0
...@@ -970,25 +970,18 @@ class Query: ...@@ -970,25 +970,18 @@ class Query:
return self.get_compiler(connection=connection).as_sql() return self.get_compiler(connection=connection).as_sql()
def resolve_lookup_value(self, value, can_reuse, allow_joins): def resolve_lookup_value(self, value, can_reuse, allow_joins):
used_joins = set()
if hasattr(value, 'resolve_expression'): if hasattr(value, 'resolve_expression'):
pre_joins = self.alias_refcount.copy()
value = value.resolve_expression(self, reuse=can_reuse, allow_joins=allow_joins) value = value.resolve_expression(self, reuse=can_reuse, allow_joins=allow_joins)
used_joins = {k for k, v in self.alias_refcount.items() if v > pre_joins.get(k, 0)}
elif isinstance(value, (list, tuple)): elif isinstance(value, (list, tuple)):
# The items of the iterable may be expressions and therefore need # The items of the iterable may be expressions and therefore need
# to be resolved independently. # to be resolved independently.
processed_values = [] processed_values = []
for sub_value in value: for sub_value in value:
if hasattr(sub_value, 'resolve_expression'): if hasattr(sub_value, 'resolve_expression'):
pre_joins = self.alias_refcount.copy()
processed_values.append( processed_values.append(
sub_value.resolve_expression(self, reuse=can_reuse, allow_joins=allow_joins) sub_value.resolve_expression(self, reuse=can_reuse, allow_joins=allow_joins)
) )
# The used_joins for a tuple of expressions is the union of return value
# the used_joins for the individual expressions.
used_joins.update(k for k, v in self.alias_refcount.items() if v > pre_joins.get(k, 0))
return value, used_joins
def solve_lookup_type(self, lookup): def solve_lookup_type(self, lookup):
""" """
...@@ -1136,7 +1129,9 @@ class Query: ...@@ -1136,7 +1129,9 @@ class Query:
if not allow_joins and len(parts) > 1: if not allow_joins and len(parts) > 1:
raise FieldError("Joined field references are not permitted in this query") raise FieldError("Joined field references are not permitted in this query")
value, used_joins = self.resolve_lookup_value(value, can_reuse, allow_joins) pre_joins = self.alias_refcount.copy()
value = self.resolve_lookup_value(value, can_reuse, allow_joins)
used_joins = {k for k, v in self.alias_refcount.items() if v > pre_joins.get(k, 0)}
clause = self.where_class() clause = self.where_class()
if reffed_expression: if reffed_expression:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment