#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.

Reply via email to