Opened 10 months ago
Last modified 9 months ago
#36155 closed Cleanup/optimization
Improve error handling when complex annotations are not passed an alias — at Version 1
| Reported by: | Vinko Mlacic | Owned by: | Vinko Mlacic |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Vinko Mlacic | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
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, ...