summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/fields/__init__.py1
-rw-r--r--tests/model_fields/tests.py18
2 files changed, 19 insertions, 0 deletions
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 0b5e7d4782..e2f8c6c48e 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -385,6 +385,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'):
diff --git a/tests/model_fields/tests.py b/tests/model_fields/tests.py
index 1fb5037625..432984f6bb 100644
--- a/tests/model_fields/tests.py
+++ b/tests/model_fields/tests.py
@@ -494,3 +494,21 @@ class GenericIPAddressFieldTests(test.TestCase):
model_field = models.GenericIPAddressField(protocol='IPv6')
form_field = model_field.formfield()
self.assertRaises(ValidationError, form_field.clean, '127.0.0.1')
+
+
+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)