Simplified calculation of used joins in Query.build_filter().
This commit is contained in:
parent
68f0bcb012
commit
0ec134e340
|
@ -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:
|
||||||
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:
|
||||||
|
|
Loading…
Reference in New Issue