﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34975	aggregate() crashes when referencing existing aggregations or window expressions through conditional expressions	Sergey Nesterenko	Simon Charette	"I found out that getting refs in QuerySet doesn't work with models.Window when I try to use aggregate method. It happened when I tried to update Django to 4.2.7.

For example:
{{{
MyModel.objects.annotate(  
	new_ordering=Window(RowNumber(),  order_by=[F('ordering')])  
).aggregate(  
	new_count=Count('id', filter=Q(ordering=F('new_ordering')))
)
}}}

And as a result, it fails with:
{{{
Traceback (most recent call last):
  File ""/main.py"", line 38, in <module>
    result = ordering_query.aggregate(
  File ""/python3.10/site-packages/django/db/models/query.py"", line 592, in aggregate
    return self.query.chain().get_aggregation(self.db, kwargs)
  File ""/python3.10/site-packages/django/db/models/sql/query.py"", line 398, in get_aggregation
    aggregate = aggregate_expr.resolve_expression(
  File ""/python3.10/site-packages/django/db/models/aggregates.py"", line 70, in resolve_expression
    for ref in c.get_refs():
  File ""/python3.10/site-packages/django/db/models/expressions.py"", line 418, in get_refs
    refs |= expr.get_refs()
  File ""/python3.10/site-packages/django/db/models/sql/where.py"", line 233, in get_refs
    refs |= child.get_refs()
  File ""/python3.10/site-packages/django/db/models/expressions.py"", line 418, in get_refs
    refs |= expr.get_refs()
  File ""/python3.10/site-packages/django/db/models/expressions.py"", line 418, in get_refs
    refs |= expr.get_refs()
AttributeError: 'NoneType' object has no attribute 'get_refs'
}}}

It happens because of Window.get_source_expressions return:
{{{
def get_source_expressions(self):  
	return [self.source_expression, self.partition_by, self.order_by, self.frame]
}}}
and if we don't specify 'frame' (for example) it will be None in the list.

And in models.aggregates.Aggregate.resolve_expression when we try to find all refs https://github.com/django/django/blob/47f9b8dca16b1fdc054b338d81eb080eabad0edf/django/db/models/aggregates.py#L70C30-L70C30 it fails because of we have None in Window.get_source_expressions
{{{
def get_refs(self):  
	refs = set()  
	for expr in self.get_source_expressions():  
		refs |= expr.get_refs()  
	return refs
}}}"	Bug	closed	Database layer (models, ORM)	4.2	Release blocker	fixed	QuerySet, Window, Aggregate, F		Ready for checkin	1	0	0	0	0	0
