Skip to content

backward incompatible to models.QuerySet - KeyError when alias expression to existing field #226

@ivan-klass

Description

@ivan-klass

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 == pg

python - 3.11
django - 4.2.7
django-postgres-extra - 2.0.8

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions