diff options
Diffstat (limited to 'django/db/models/sql')
| -rw-r--r-- | django/db/models/sql/compiler.py | 4 | ||||
| -rw-r--r-- | django/db/models/sql/query.py | 9 | ||||
| -rw-r--r-- | django/db/models/sql/where.py | 10 |
3 files changed, 22 insertions, 1 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 01c303eb7e..11ff51f60f 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1107,6 +1107,8 @@ class SQLInsertCompiler(SQLCompiler): ) if value.contains_aggregate: raise FieldError("Aggregate functions are not allowed in this query") + if value.contains_over_clause: + raise FieldError('Window expressions are not allowed in this query.') else: value = field.get_db_prep_save(value, connection=self.connection) return value @@ -1262,6 +1264,8 @@ class SQLUpdateCompiler(SQLCompiler): val = val.resolve_expression(self.query, allow_joins=False, for_save=True) if val.contains_aggregate: raise FieldError("Aggregate functions are not allowed in this query") + if val.contains_over_clause: + raise FieldError('Window expressions are not allowed in this query.') elif hasattr(val, 'prepare_database_save'): if field.remote_field: val = field.get_db_prep_save( diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 017edea873..4cd22c7b8a 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -13,7 +13,7 @@ from string import ascii_uppercase from django.core.exceptions import ( EmptyResultSet, FieldDoesNotExist, FieldError, ) -from django.db import DEFAULT_DB_ALIAS, connections +from django.db import DEFAULT_DB_ALIAS, NotSupportedError, connections from django.db.models.aggregates import Count from django.db.models.constants import LOOKUP_SEP from django.db.models.expressions import Col, Ref @@ -1125,6 +1125,13 @@ class Query: if not arg: raise FieldError("Cannot parse keyword query %r" % arg) lookups, parts, reffed_expression = self.solve_lookup_type(arg) + + if not getattr(reffed_expression, 'filterable', True): + raise NotSupportedError( + reffed_expression.__class__.__name__ + ' is disallowed in ' + 'the filter clause.' + ) + if not allow_joins and len(parts) > 1: raise FieldError("Joined field references are not permitted in this query") diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py index ed24b08bd0..0ca95f7018 100644 --- a/django/db/models/sql/where.py +++ b/django/db/models/sql/where.py @@ -167,6 +167,16 @@ class WhereNode(tree.Node): def contains_aggregate(self): return self._contains_aggregate(self) + @classmethod + def _contains_over_clause(cls, obj): + if isinstance(obj, tree.Node): + return any(cls._contains_over_clause(c) for c in obj.children) + return obj.contains_over_clause + + @cached_property + def contains_over_clause(self): + return self._contains_over_clause(self) + @property def is_summary(self): return any(child.is_summary for child in self.children) |
