Opened 4 months ago
Last modified 3 months ago
#36352 assigned Cleanup/optimization
Weird behavior of .values after a distinct in 5.1.8 — at Version 2
Reported by: | Joseph Yu | Owned by: | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 5.0 |
Severity: | Normal | Keywords: | .values, distinct |
Cc: | Joseph Yu, Simon Charette | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Was upgrading from 4.2.20 to 5.1.8 when tests were failing with a certain query in our app.
Sample code (not actual code and table; only used one table in this case):
>>> a = Tenant.objects.filter(id__in=[1, 3]).values('id').annotate(schema=F('schema_name'), created=F('created_at')) >>> b = Tenant.objects.filter(id=2).values('id').annotate(schema=F('schema_name'), created=F('created_at')) >>> c = (a|b).distinct() >>> d = c.filter(id=OuterRef('id')).values('schema') >>> e = Tenant.objects.values('schema_name').annotate(created_at=Subquery(d.values('created')))
This throws an error in 5.1.8:
Traceback (most recent call last): File "<console>", line 1, in <module> File "/Users/user/.pyenv/versions/3.13.0/lib/python3.13/site-packages/django/db/models/query.py", line 1360, in values clone = self._values(*fields, **expressions) File "/Users/user/.pyenv/versions/3.13.0/lib/python3.13/site-packages/django/db/models/query.py", line 1355, in _values clone.query.set_values(fields) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^ File "/Users/user/.pyenv/versions/3.13.0/lib/python3.13/site-packages/django/db/models/sql/query.py", line 2462, in set_values raise FieldError( ...<2 lines>... ) django.core.exceptions.FieldError: Cannot select the 'created' alias. Use annotate() to promote it.
Current workaround is to include the annotated field in .values like so
>>> d = c.filter(id=OuterRef('id')).values('schema', 'created') >>> e = Tenant.objects.values('schema_name').annotate(created_at=Subquery(c.values('created')[:1])) >>> e[:1] <QuerySet [{'schema_name': 'sample', 'created_at': datetime.date(2024, 11, 4)}]>
Change History (2)
comment:1 by , 4 months ago
Description: | modified (diff) |
---|
comment:2 by , 4 months ago
Description: | modified (diff) |
---|
Note:
See TracTickets
for help on using tickets.