Commit f19a3669 authored by Tim Graham's avatar Tim Graham
Browse files

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.
parent af953c45
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -499,6 +499,7 @@ class Field(object):
        """
        if not prepared:
            value = self.get_prep_lookup(lookup_type, value)
            prepared = True
        if hasattr(value, 'get_compiler'):
            value = value.get_compiler(connection=connection)
        if hasattr(value, 'as_sql') or hasattr(value, '_as_sql'):
+18 −0
Original line number Diff line number Diff line
@@ -663,3 +663,21 @@ class PromiseTest(test.TestCase):
        self.assertIsInstance(
            URLField().get_prep_value(lazy_func()),
            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)