﻿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
36155	Improve error handling when complex annotations are not passed an alias	Vinko Mlacic	Vinko Mlacic	"When complex annotations are not passed an alias, the default alias is usually used. If the `annotate` arg does not define the default alias, an error saying ""Complex annotations require an alias"" is raised. 

This works fine with args that are subclasses of `Aggregate` subclass because the `default_alias` property on the `Aggregate` subclass raises that same `TypeError`.

However, when using expressions that are not `Aggregate` subclasses, this fails with an obscure message saying that `default_alias` is not a property on the expression object.

Code to reproduce:

== models.py:
{{{
class Book(models.Model):
    name = models.CharField(max_length=255)
}}}

== tests.py:
{{{
Book.objects.annotate(Value(""title""))
}}}

{{{
Traceback (most recent call last):
  File ""/usr/lib/python3.12/unittest/case.py"", line 58, in testPartExecutor
    yield
  File ""/usr/lib/python3.12/unittest/case.py"", line 634, in run
    self._callTestMethod(testMethod)
  File ""/usr/lib/python3.12/unittest/case.py"", line 589, in _callTestMethod
    if method() is not None:
       ^^^^^^^^
  File ""/home/vinko/projects/django/tests/annotations/tests.py"", line 975, in test_complex_annotations_must_have_an_alias
    Book.objects.annotate(Value(""title""))
  File ""/home/vinko/projects/django/django/db/models/manager.py"", line 87, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ""/home/vinko/projects/django/django/db/models/query.py"", line 1631, in annotate
    return self._annotate(args, kwargs, select=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ""/home/vinko/projects/django/django/db/models/query.py"", line 1648, in _annotate
    if arg.default_alias in kwargs:
       ^^^^^^^^^^^^^^^^^
AttributeError: 'Value' object has no attribute 'default_alias'

}}}


Similar happens with other non `Aggregate` types like: `F`, `Case` - `When`, `Subquery`, `Exists`, ..."	Cleanup/optimization	assigned	Database layer (models, ORM)	dev	Normal			Vinko Mlacic	Unreviewed	1	0	0	0	0	0
