Fixed #14786 -- Fixed get_db_prep_lookup calling get_prep_value twice if prepared is False.

Thanks homm for the report and Aramgutang and lrekucki for work on
the patch.
This commit is contained in:
Tim Graham 2013-08-29 11:09:58 -04:00
parent af953c45cc
commit f19a3669b8
2 changed files with 19 additions and 0 deletions

View File

@ -499,6 +499,7 @@ class Field(object):
""" """
if not prepared: if not prepared:
value = self.get_prep_lookup(lookup_type, value) value = self.get_prep_lookup(lookup_type, value)
prepared = True
if hasattr(value, 'get_compiler'): if hasattr(value, 'get_compiler'):
value = value.get_compiler(connection=connection) value = value.get_compiler(connection=connection)
if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'): if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'):

View File

@ -663,3 +663,21 @@ class PromiseTest(test.TestCase):
self.assertIsInstance( self.assertIsInstance(
URLField().get_prep_value(lazy_func()), URLField().get_prep_value(lazy_func()),
six.text_type) six.text_type)
class CustomFieldTests(unittest.TestCase):
def test_14786(self):
"""
Regression test for #14786 -- Test that field values are not prepared
twice in get_db_prep_lookup().
"""
prepare_count = [0]
class NoopField(models.TextField):
def get_prep_value(self, value):
prepare_count[0] += 1
return super(NoopField, self).get_prep_value(value)
field = NoopField()
field.get_db_prep_lookup('exact', 'TEST', connection=connection, prepared=False)
self.assertEqual(prepare_count[0], 1)