Skip to content

Commit 258e42f

Browse files
authored
Merge pull request #116 from dimagi/dm/fix-dj52-ref
Fix CTE ref resolution regression in Django 5.2
2 parents 6e939b4 + 6121fe9 commit 258e42f

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

.github/workflows/tests.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ jobs:
4747
exclude:
4848
- {python: '3.9', django: 'Django~=5.1.0'}
4949
- {python: '3.9', django: 'Django~=5.2.0'}
50+
env:
51+
allowed_python_failure: '3.14'
5052
services:
5153
postgres:
5254
image: postgres:latest
@@ -83,5 +85,6 @@ jobs:
8385
"PORT":"5432"
8486
}
8587
run: .venv/bin/pytest -v
88+
continue-on-error: ${{ matrix.python == env.allowed_python_failure }}
8689
- name: Check style
8790
run: .venv/bin/ruff check

django_cte/cte.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ def queryset(self):
113113
qs._iterable_class = ValuesIterable
114114
for alias in getattr(cte_query, "selected", None) or ():
115115
if alias not in cte_query.annotations:
116-
field = cte_query.resolve_ref(alias).output_field
117-
col = CTEColumnRef(alias, self.name, field)
116+
col = Ref(alias, cte_query.resolve_ref(alias))
118117
query.add_annotation(col, alias)
119118
if cte_query.annotations:
120119
for alias, value in cte_query.annotations.items():
@@ -128,7 +127,7 @@ def queryset(self):
128127
def _resolve_ref(self, name):
129128
selected = getattr(self.query, "selected", None)
130129
if selected and name in selected and name not in self.query.annotations:
131-
return Ref(name, self.query)
130+
return Ref(name, self.query.resolve_ref(name))
132131
return self.query.resolve_ref(name)
133132

134133

tests/test_cte.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,3 +640,36 @@ def test_cte_select_pk(self):
640640
{'pk': 11},
641641
{'pk': 12},
642642
])
643+
644+
def test_django52_resolve_ref_regression(self):
645+
cte = With(
646+
Order.objects.annotate(
647+
pnt_id=F("region__parent_id"),
648+
region_name=F("region__name"),
649+
).values(
650+
# important: more than one query.select field
651+
"region_id",
652+
"amount",
653+
# important: more than one query.annotations field
654+
"pnt_id",
655+
"region_name",
656+
)
657+
)
658+
qs = (
659+
cte.queryset()
660+
.with_cte(cte)
661+
.values(
662+
amt=cte.col.amount,
663+
pnt_id=cte.col.pnt_id,
664+
region_name=cte.col.region_name,
665+
)
666+
.filter(region_id="earth")
667+
.order_by("amount")
668+
)
669+
print(qs.query)
670+
self.assertEqual(list(qs), [
671+
{'amt': 30, 'region_name': 'earth', 'pnt_id': 'sun'},
672+
{'amt': 31, 'region_name': 'earth', 'pnt_id': 'sun'},
673+
{'amt': 32, 'region_name': 'earth', 'pnt_id': 'sun'},
674+
{'amt': 33, 'region_name': 'earth', 'pnt_id': 'sun'},
675+
])

0 commit comments

Comments
 (0)