#36299: ORM Regressions in Django 5.2
-------------------------------------+-------------------------------------
Reporter: OutOfFocus4 | Owner: (none)
Type: Bug | Status: new
Component: Database layer | Version: 5.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by OutOfFocus4:
Old description:
> ORM calls that worked prior to Django 5.2 now return different results or
> outright fail in Django 5.2. I have attached a file with proof-of-concept
> tests.
>
> The first issue I noticed is that calling `alias` on after `values_list`
> adds the aliased value to the result set. I believe the root of this
> error is in `django/db/models/sql/query.py` lines 1224 and 1225:
>
> {{{#!python
> if self.selected:
> self.selected[alias] = alias
> }}}
>
> This code adds the alias to `selected` regardless of the value of the
> `select` parameter.
>
> Another issue I found causes queryset evaluation to raise an
> `AttributeError`. The following code:
>
> {{{#!python
> with atomic():
> values = (
> User.objects.select_for_update(of=("self",))
> .values_list(
> Concat(F("first_name"), Value(" "), F("last_name")), "email"
> )
> .get(pk=12)
> )
> }}}
>
> will fail with a stacktrace ending in `AttributeError: 'Concat' object
> has no attribute 'target'`
New description:
ORM calls that worked prior to Django 5.2 now return different results or
outright fail in Django 5.2. I have attached a file with proof-of-concept
tests.
The first issue I noticed is that calling `alias` on after `values_list`
adds the aliased value to the result set. I believe the root of this error
is in `django/db/models/sql/query.py` lines 1224 and 1225:
{{{#!python
if self.selected:
self.selected[alias] = alias
}}}
This code adds the alias to `selected` regardless of the value of the
`select` parameter.
Another issue I found causes queryset evaluation to raise an
`AttributeError` if the database backend supports `SELECT ... FOR UPDATE`.
The following code:
{{{#!python
with atomic():
values = (
User.objects.select_for_update(of=("self",))
.values_list(
Concat(F("first_name"), Value(" "), F("last_name")), "email"
)
.get(pk=12)
)
}}}
will fail with a stacktrace ending in `AttributeError: 'Concat' object has
no attribute 'target'` using the `postgresql` DB backend.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/36299#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/django-updates/0107019600fb31b8-235e7251-57fc-4d0a-b99a-cab5ddefcd10-000000%40eu-central-1.amazonses.com.