From 7cbffe6e42e7610ad4d211f138fa872063476edf Mon Sep 17 00:00:00 2001 From: David Sanders Date: Fri, 23 Sep 2022 17:46:57 +1000 Subject: [PATCH] Only call flatten() once & address some review comments --- django/db/models/query_utils.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py index 1d2a99d5fd..76be446f42 100644 --- a/django/db/models/query_utils.py +++ b/django/db/models/query_utils.py @@ -156,17 +156,18 @@ class Q(tree.Node): Retrieve all base fields referenced directly or through F expressions excluding any fields referenced through joins. """ - # Avoid circular imports + # Avoid circular imports. from django.db.models import F - f_references = set(expr.name for expr in self.flatten() if isinstance(expr, F)) - q_references = set( + expressions = list(self.flatten()) + f_references = {expr.name for expr in expressions if isinstance(expr, F)} + q_references = { child[0].split(LOOKUP_SEP)[0] - for expr in self.flatten() + for expr in expressions if isinstance(expr, Q) for child in expr.children if isinstance(child, tuple) - ) + } return f_references | q_references