[1.8.x] Fixed #25506 -- Allowed filtering over a RawSQL annotation.

Co-Authored-By: Gavin Wahl <gwahl@fusionbox.com>

Backport of b971c1cd78 from master
This commit is contained in:
Antoine Catton 2015-10-05 14:13:14 -06:00 committed by Tim Graham
parent 4171d208f4
commit ee6785ebea
3 changed files with 15 additions and 1 deletions

View File

@ -204,7 +204,7 @@ class BuiltinLookup(Lookup):
lhs_sql = connection.ops.field_cast_sql( lhs_sql = connection.ops.field_cast_sql(
db_type, field_internal_type) % lhs_sql db_type, field_internal_type) % lhs_sql
lhs_sql = connection.ops.lookup_cast(self.lookup_name, field_internal_type) % lhs_sql lhs_sql = connection.ops.lookup_cast(self.lookup_name, field_internal_type) % lhs_sql
return lhs_sql, params return lhs_sql, list(params)
def as_sql(self, compiler, connection): def as_sql(self, compiler, connection):
lhs_sql, params = self.process_lhs(compiler, connection) lhs_sql, params = self.process_lhs(compiler, connection)

View File

@ -21,3 +21,5 @@ Bugfixes
* Fixed incorrect queries when you have multiple ``ManyToManyField``\s on * Fixed incorrect queries when you have multiple ``ManyToManyField``\s on
different models that have the same field name, point to the same model, and different models that have the same field name, point to the same model, and
have their reverse relations disabled (:ticket:`25545`). have their reverse relations disabled (:ticket:`25545`).
* Allowed filtering over a ``RawSQL`` annotation (:ticket:`25506`).

View File

@ -57,6 +57,18 @@ class BasicExpressionsTests(TestCase):
) )
self.assertEqual(companies['result'], 2395) self.assertEqual(companies['result'], 2395)
def test_annotate_values_filter(self):
companies = Company.objects.annotate(
foo=RawSQL('%s', ['value']),
).filter(foo='value').order_by('name')
self.assertQuerysetEqual(
companies, [
'<Company: Example Inc.>',
'<Company: Foobar Ltd.>',
'<Company: Test GmbH>',
],
)
def test_filter_inter_attribute(self): def test_filter_inter_attribute(self):
# We can filter on attribute relationships on same model obj, e.g. # We can filter on attribute relationships on same model obj, e.g.
# find companies where the number of employees is greater # find companies where the number of employees is greater