summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2021-11-23 00:39:04 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-11-23 07:58:44 +0100
commitaec71aaa5b029640ce066fe5dc34f7a0050d50b2 (patch)
tree0edbf978e36f61b66fa9b9d1135673d6a0c2ba19 /django
parente06dc4571ea9fd5723c8029959b95808be9f8812 (diff)
Fixed #33304 -- Allowed passing string expressions to Window(order_by).
Diffstat (limited to 'django')
-rw-r--r--django/db/models/expressions.py21
1 files changed, 11 insertions, 10 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 07fc32d25b..afdf3402e5 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -1333,11 +1333,13 @@ class Window(SQLiteNumericMixin, Expression):
if self.order_by is not None:
if isinstance(self.order_by, (list, tuple)):
- self.order_by = ExpressionList(*self.order_by)
- elif not isinstance(self.order_by, BaseExpression):
+ self.order_by = OrderByList(*self.order_by)
+ elif isinstance(self.order_by, (BaseExpression, str)):
+ self.order_by = OrderByList(self.order_by)
+ else:
raise ValueError(
- 'order_by must be either an Expression or a sequence of '
- 'expressions.'
+ 'Window.order_by must be either a string reference to a '
+ 'field, an expression, or a list or tuple of them.'
)
super().__init__(output_field=output_field)
self.source_expression = self._parse_expressions(expression)[0]
@@ -1363,18 +1365,17 @@ class Window(SQLiteNumericMixin, Expression):
compiler=compiler, connection=connection,
template='PARTITION BY %(expressions)s',
)
- window_sql.extend(sql_expr)
+ window_sql.append(sql_expr)
window_params.extend(sql_params)
if self.order_by is not None:
- window_sql.append(' ORDER BY ')
order_sql, order_params = compiler.compile(self.order_by)
- window_sql.extend(order_sql)
+ window_sql.append(order_sql)
window_params.extend(order_params)
if self.frame:
frame_sql, frame_params = compiler.compile(self.frame)
- window_sql.append(' ' + frame_sql)
+ window_sql.append(frame_sql)
window_params.extend(frame_params)
params.extend(window_params)
@@ -1382,7 +1383,7 @@ class Window(SQLiteNumericMixin, Expression):
return template % {
'expression': expr_sql,
- 'window': ''.join(window_sql).strip()
+ 'window': ' '.join(window_sql).strip()
}, params
def as_sqlite(self, compiler, connection):
@@ -1399,7 +1400,7 @@ class Window(SQLiteNumericMixin, Expression):
return '{} OVER ({}{}{})'.format(
str(self.source_expression),
'PARTITION BY ' + str(self.partition_by) if self.partition_by else '',
- 'ORDER BY ' + str(self.order_by) if self.order_by else '',
+ str(self.order_by or ''),
str(self.frame or ''),
)