diff options
| author | Simon Charette <charette.s@gmail.com> | 2021-11-23 00:39:04 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-11-23 07:58:44 +0100 |
| commit | aec71aaa5b029640ce066fe5dc34f7a0050d50b2 (patch) | |
| tree | 0edbf978e36f61b66fa9b9d1135673d6a0c2ba19 /django | |
| parent | e06dc4571ea9fd5723c8029959b95808be9f8812 (diff) | |
Fixed #33304 -- Allowed passing string expressions to Window(order_by).
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/models/expressions.py | 21 |
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 ''), ) |
