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 Joseph Yu)

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 Joseph Yu, 4 months ago

Description: modified (diff)

comment:2 by Joseph Yu, 4 months ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top