From 4137fc2efce2dde48340728b8006fc6d66b9e3a5 Mon Sep 17 00:00:00 2001 From: Matthew Schinckel Date: Mon, 27 Feb 2017 19:31:52 +1030 Subject: Fixed #25367 -- Allowed boolean expressions in QuerySet.filter() and exclude(). This allows using expressions that have an output_field that is a BooleanField to be used directly in a queryset filters, or in the When() clauses of a Case() expression. Thanks Josh Smeaton, Tim Graham, Simon Charette, Mariusz Felisiak, and Adam Johnson for reviews. Co-Authored-By: NyanKiyoshi --- django/db/models/sql/query.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'django/db/models/sql') diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 4ad1fb3f36..35f3c5e1ea 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1229,6 +1229,16 @@ class Query(BaseExpression): """ if isinstance(filter_expr, dict): raise FieldError("Cannot parse keyword query as dict") + if hasattr(filter_expr, 'resolve_expression') and getattr(filter_expr, 'conditional', False): + if connections[DEFAULT_DB_ALIAS].ops.conditional_expression_supported_in_where_clause(filter_expr): + condition = filter_expr.resolve_expression(self) + else: + # Expression is not supported in the WHERE clause, add + # comparison with True. + condition = self.build_lookup(['exact'], filter_expr.resolve_expression(self), True) + clause = self.where_class() + clause.add(condition, AND) + return clause, [] arg, value = filter_expr if not arg: raise FieldError("Cannot parse keyword query %r" % arg) -- cgit v1.3