django-cte 2.0.1.dev20251006193645__py3-none-any.whl → 2.0.1.dev20251027172651__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
django_cte/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  from .cte import CTE, with_cte, CTEManager, CTEQuerySet, With # noqa
2
2
 
3
- __version__ = "2.0.1.dev20251006193645"
3
+ __version__ = "2.0.1.dev20251027172651"
4
4
  __all__ = ["CTE", "with_cte"]
django_cte/cte.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from copy import copy
2
2
 
3
+ import django
3
4
  from django.db.models import Manager, sql
4
5
  from django.db.models.expressions import Ref
5
6
  from django.db.models.query import Q, QuerySet, ValuesIterable
@@ -45,21 +46,30 @@ class CTE:
45
46
  """
46
47
 
47
48
  def __init__(self, queryset, name="cte", materialized=False):
48
- self.query = None if queryset is None else queryset.query
49
+ self._set_queryset(queryset)
49
50
  self.name = name
50
51
  self.col = CTEColumns(self)
51
52
  self.materialized = materialized
52
53
 
53
54
  def __getstate__(self):
54
- return (self.query, self.name, self.materialized)
55
+ return (self.query, self.name, self.materialized, self._iterable_class)
55
56
 
56
57
  def __setstate__(self, state):
57
- self.query, self.name, self.materialized = state
58
+ if len(state) == 3:
59
+ # Keep compatibility with the previous serialization method
60
+ self.query, self.name, self.materialized = state
61
+ self._iterable_class = ValuesIterable
62
+ else:
63
+ self.query, self.name, self.materialized, self._iterable_class = state
58
64
  self.col = CTEColumns(self)
59
65
 
60
66
  def __repr__(self):
61
67
  return f"<{type(self).__name__} {self.name}>"
62
68
 
69
+ def _set_queryset(self, queryset):
70
+ self.query = None if queryset is None else queryset.query
71
+ self._iterable_class = getattr(queryset, "_iterable_class", ValuesIterable)
72
+
63
73
  @classmethod
64
74
  def recursive(cls, make_cte_queryset, name="cte", materialized=False):
65
75
  """Recursive Common Table Expression
@@ -73,7 +83,7 @@ class CTE:
73
83
  :returns: The fully constructed recursive cte object.
74
84
  """
75
85
  cte = cls(None, name, materialized)
76
- cte.query = make_cte_queryset(cte).query
86
+ cte._set_queryset(make_cte_queryset(cte))
77
87
  return cte
78
88
 
79
89
  def join(self, model_or_queryset, *filter_q, **filter_kw):
@@ -124,24 +134,30 @@ class CTE:
124
134
  """
125
135
  cte_query = self.query
126
136
  qs = cte_query.model._default_manager.get_queryset()
137
+ qs._iterable_class = self._iterable_class
138
+ qs._fields = () # Allow any field names to be used in further annotations
127
139
 
128
140
  query = jit_mixin(sql.Query(cte_query.model), CTEQuery)
129
141
  query.join(BaseTable(self.name, None))
130
142
  query.default_cols = cte_query.default_cols
131
143
  query.deferred_loading = cte_query.deferred_loading
132
- if cte_query.values_select:
144
+
145
+ if django.VERSION < (5, 2) and cte_query.values_select:
133
146
  query.set_values(cte_query.values_select)
134
- qs._iterable_class = ValuesIterable
147
+
135
148
  if cte_query.annotations:
136
149
  for alias, value in cte_query.annotations.items():
137
150
  col = CTEColumnRef(alias, self.name, value.output_field)
138
151
  query.add_annotation(col, alias)
139
152
  query.annotation_select_mask = cte_query.annotation_select_mask
140
- for alias in getattr(cte_query, "selected", None) or ():
141
- if alias not in cte_query.annotations:
142
- output_field = cte_query.resolve_ref(alias).output_field
143
- col = CTEColumnRef(alias, self.name, output_field)
144
- query.add_annotation(col, alias)
153
+
154
+ if selected := getattr(cte_query, "selected", None):
155
+ for alias in selected:
156
+ if alias not in cte_query.annotations:
157
+ output_field = cte_query.resolve_ref(alias).output_field
158
+ col = CTEColumnRef(alias, self.name, output_field)
159
+ query.add_annotation(col, alias)
160
+ query.selected = {alias: alias for alias in selected}
145
161
 
146
162
  qs.query = query
147
163
  return qs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cte
3
- Version: 2.0.1.dev20251006193645
3
+ Version: 2.0.1.dev20251027172651
4
4
  Summary: Common Table Expressions (CTE) for Django
5
5
  Author-email: Daniel Miller <millerdev@gmail.com>
6
6
  Requires-Python: >= 3.9
@@ -1,12 +1,12 @@
1
- django_cte/__init__.py,sha256=gMYzdKjI_095EcobSVAElk83rrLsqHQMs9Bz-5ZOOa0,141
1
+ django_cte/__init__.py,sha256=i9NSCeEHNvcjP4gHaBF3kZkBWjKPStC-rPC5YVAIV_k,141
2
2
  django_cte/_deprecated.py,sha256=OAEmWVqnoi-27m2nyrfTIwVwPE1J8VLrfspgRHW-EZI,5623
3
- django_cte/cte.py,sha256=3DnlrjZ8CDbClCwDGAI_LHFFK0mhP7Fiz_s1p9buam4,8214
3
+ django_cte/cte.py,sha256=navhZjCcEqdSN9ICC2D8z12FqTPuftv8qOGvarxklg0,8892
4
4
  django_cte/jitmixin.py,sha256=JRTRlbBhD8XD0GHwxg8wKdJSbcTv_zUrSyqtOSfgM5M,885
5
5
  django_cte/join.py,sha256=2b1iBKFFiqBqYBmX4W9q2RfX17xXjZbbzClpUdbnUtA,3156
6
6
  django_cte/meta.py,sha256=gNBtegkvg5CXcEPyt1nZMIF2UlsPMTUPStVJSsRni3I,3491
7
7
  django_cte/query.py,sha256=djY7Bknl_NQSd1g6zy8N3fU3h2r8OfpyeJY_Zt9a7fg,5582
8
8
  django_cte/raw.py,sha256=6_YDCKBsgXx1oQku4EcyK4qJmnmiyzEeZRxiYdkg8Y8,1045
9
- django_cte-2.0.1.dev20251006193645.dist-info/licenses/LICENSE,sha256=mkLNw_QhpZ40jBEbuAosqH4ciA3KMrwb8aSYbTmy5gc,1508
10
- django_cte-2.0.1.dev20251006193645.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
11
- django_cte-2.0.1.dev20251006193645.dist-info/METADATA,sha256=TZ4PjzPc6egcGj0xx0PT8e6SILuqvm1StuF7p5Oewos,2646
12
- django_cte-2.0.1.dev20251006193645.dist-info/RECORD,,
9
+ django_cte-2.0.1.dev20251027172651.dist-info/licenses/LICENSE,sha256=mkLNw_QhpZ40jBEbuAosqH4ciA3KMrwb8aSYbTmy5gc,1508
10
+ django_cte-2.0.1.dev20251027172651.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
11
+ django_cte-2.0.1.dev20251027172651.dist-info/METADATA,sha256=H0FKQAlA2Fh_KJY-9STA2Yrde2FFG-sC2LlHJXzJQ8E,2646
12
+ django_cte-2.0.1.dev20251027172651.dist-info/RECORD,,