Opened 6 days ago

Last modified 44 hours ago

#36288 assigned Bug

Regression in values_list() with duplicated field names

Reported by: Claude Paroz Owned by: Simon Charette
Component: Database layer (models, ORM) Version: 5.2
Severity: Release blocker Keywords:
Cc: Simon Charette Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no
Pull Requests:19332 build:success

Description

In Django 5.2, a call to values_list("field", "field") will return tuples with a single member, as duplicated field names seem to be filtered out somewhere.

I suspect a regression caused by #28900.

According to the ticket's flags, the next step(s) to move this issue forward are:

  • For a Django committer to do a final review of the patch and merge it if all looks good.

Change History (5)

comment:1 by Natalia Bidart, 6 days ago

Cc: Simon Charette added
Triage Stage: UnreviewedAccepted

Thank you Claude for the report! I have reproduced with the following:

>>> import django
>>> django.VERSION
(6, 0, 0, 'alpha', 0)
>>> [i for i in User.objects.all().values_list("username", "username")]
[('admin',)]

Versus:

>>> import django
>>> django.VERSION
(5, 1, 7, 'final', 0)
>>> from django.contrib.auth.models import User
>>> [i for i in User.objects.all().values_list("username", "username")]
[('admin', 'admin')]

Now, I'm not sure this is a bug? I mean there is certainly a change in behavior, but to me the 5.1 result feels "buggy", so in a way this "was fixed" in 5.2.
On the other hand, the DB query does duplicate the columns so perhaps this *is* a regression:

psql (16.8 (Ubuntu 16.8-0ubuntu0.24.04.1))
Type "help" for help.

djangotest=# select username, username from auth_user;
 username | username 
----------+----------
 admin    | admin
(1 row)

Claude, could you indulge me and share in the ticket the use case for getting the repeated fields in the values_list result? Accepting in the meantime.

comment:2 by Simon Charette, 6 days ago

Owner: set to Simon Charette
Status: newassigned

This is effectively a regression caused by #28900 (65ad4ade74dc9208b9d686a451cd6045df0c9c3a) as sql.Query.selected is now a dict[alias, Expression] and since values_list defaults to using the provided strings as field names they get considered to be a single one.

We'll most likely have to generate an alias for the existing members with colliding names.

Last edited 6 days ago by Simon Charette (previous) (diff)

comment:3 by Simon Charette, 6 days ago

Has patch: set

comment:4 by Claude Paroz, 6 days ago

Thanks for the quick reaction! FWIW, the use case that revealed this was a QuerySet to produce tuples for form choices where the value and the verbose parts were identical.

comment:5 by Sarah Boyce, 44 hours ago

Triage Stage: AcceptedReady for checkin
Note: See TracTickets for help on using tickets.
Back to Top