- 
                Notifications
    You must be signed in to change notification settings 
- Fork 107
Closed
Description
In certain conditions PostgresQuerySet behaves differently and raises KeyError where django QuerySet doesn't.
In example below, when using named expressions in .values clause after .distinct() and one of the names shadows an existing column (id) - a KeyError is observed
File ~/.pyenv/versions/example/lib/python3.11/site-packages/django/db/models/sql/query.py:2444, in Query.set_values(self, fields)
   2442 for expr in self.group_by:
   2443     if isinstance(expr, Ref) and expr.refs not in selected:
-> 2444         expr = self.annotations[expr.refs]
   2445     group_by.append(expr)
   2446 self.group_by = tuple(group_by)
KeyError: 'id_new'
from django.conf import settings
from django.db import models
from psqlextra.query import PostgresQuerySet
class Example(models.Model):
    foo = models.CharField()
    bar = models.CharField()
    baz = models.CharField()
    objects = models.QuerySet.as_manager()
    pg_objects = PostgresQuerySet.as_manager()
    class Meta:
        app_label = "whatever"
def reassign_alias(manager):
    return sorted(
        manager.values("foo").distinct().values(max_bar=models.Max("bar"), id=models.F("baz")),
        key=lambda r: r["id"]
    )
def test():
    default = reassign_alias(Example.objects)
    pg = reassign_alias(Example.pg_objects)  # KeyError
    assert default == pgpython - 3.11
django - 4.2.7
django-postgres-extra - 2.0.8
Mogost
Metadata
Metadata
Assignees
Labels
No labels