diff options
| author | Simon Charette <charette.s@gmail.com> | 2023-11-07 21:47:37 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-11-08 15:48:15 +0300 |
| commit | 8b1acc0440418ac8f45ba48e2dfcf5126c83341b (patch) | |
| tree | 40e63236a346a455807ae07f84e965f5321aed0a | |
| parent | 5f2f12f61c8e9bc0323efea391ee56e721ce14c6 (diff) | |
Refs #30446, Refs #34944 -- Fixed crash when adding GeneratedField with string Value().
This should allow smarter output_field inferring in functions dealing
with text expressions.
Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95.
| -rw-r--r-- | django/db/models/expressions.py | 2 | ||||
| -rw-r--r-- | tests/expressions/tests.py | 1 | ||||
| -rw-r--r-- | tests/schema/tests.py | 17 |
3 files changed, 19 insertions, 1 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index 3a0c75ebf2..4d4f3c4ecc 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -1082,7 +1082,7 @@ class Value(SQLiteNumericMixin, Expression): def _resolve_output_field(self): if isinstance(self.value, str): - return fields.CharField() + return fields.CharField(max_length=len(self.value)) if isinstance(self.value, bool): return fields.BooleanField() if isinstance(self.value, int): diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index 073e2e9258..9743d024b1 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -2227,6 +2227,7 @@ class ValueTests(TestCase): with self.subTest(type=type(value)): expr = Value(value) self.assertIsInstance(expr.output_field, output_field_type) + self.assertEqual(Value("foo").output_field.max_length, 3) def test_resolve_output_field_failure(self): msg = "Cannot resolve expression type, unknown output_field" diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 72f90c934b..1298b32caf 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -844,6 +844,23 @@ class SchemaTests(TransactionTestCase): @isolate_apps("schema") @skipUnlessDBFeature("supports_stored_generated_columns") + def test_add_generated_field_with_string_value(self): + class GeneratedFieldStringValueModel(Model): + value = GeneratedField(expression=Value("static string"), db_persist=True) + + class Meta: + app_label = "schema" + + with CaptureQueriesContext(connection) as ctx: + with connection.schema_editor() as editor: + editor.create_model(GeneratedFieldStringValueModel) + self.assertIs( + any("None" in query["sql"] for query in ctx.captured_queries), + False, + ) + + @isolate_apps("schema") + @skipUnlessDBFeature("supports_stored_generated_columns") def test_add_generated_field_with_output_field(self): class GeneratedFieldOutputFieldModel(Model): price = DecimalField(max_digits=7, decimal_places=2) |
