﻿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
32007	QuerySet.annotate() with WhereNode() crashes with AttributeError.	Gordon Wrigley	Mariusz Felisiak	"I think I've found a regression in 3.1, I'm seeing this across databases and Python versions but only on Django 3.1.
With reference to the polls app the queryset I hit this on is essentially:
{{{#!python
Question.objects.values(""question_text"").annotate(
    pub_date__count=Count(""pub_date"", distinct=True),
    pub_date__is_null=ExpressionWrapper(Q(pub_date=None), output_field=BooleanField())
).values(""question_text"", ""pub_date__count"", ""pub_date__is_null"")
}}}
This results in:
{{{
~\.venv\django_tutorial\lib\site-packages\django\db\models\query.py in annotate(self, *args, **kwargs)
   1121                     clone.query.group_by = True
   1122                 else:
-> 1123                     clone.query.set_group_by()
   1124                 break
   1125

~\.venv\django_tutorial\lib\site-packages\django\db\models\sql\query.py in set_group_by(self, allow_aliases)
   1979                     if not allow_aliases or alias in column_names:
   1980                         alias = None
-> 1981                     group_by_cols = annotation.get_group_by_cols(alias=alias)
   1982                 group_by.extend(group_by_cols)
   1983         self.group_by = tuple(group_by)

~\.venv\django_tutorial\lib\site-packages\django\db\models\expressions.py in get_group_by_cols(self, alias)
    867
    868     def get_group_by_cols(self, alias=None):
--> 869         expression = self.expression.copy()
    870         expression.output_field = self.output_field
    871         return expression.get_group_by_cols(alias=alias)

AttributeError: 'WhereNode' object has no attribute 'copy'
}}}

It's a bit of a dumb query but given my usecase https://pypi.org/project/django-data-browser/ that's a little beyond my control.

Still it's kinda surprising that it worked on 3.0 and doesn't on 3.1.

It can be simplified a bit and still get essentially the same result:
{{{#!python
Question.objects.annotate(
    pub_date__count=Count(""pub_date"", distinct=True),
    pub_date__is_null=ExpressionWrapper(Q(pub_date=None), output_field=BooleanField())
)
}}}

Removing either of the annotate clauses ""fixes"" it."	Bug	closed	Database layer (models, ORM)	3.1	Release blocker	fixed			Accepted	1	0	0	0	0	0
