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 16:18:00 +0300 |
| commit | 73869a51632b9f826d4d7b9e888f81d60b16e8b6 (patch) | |
| tree | 4ed54c1f77e46b67ab76df66fe2204f2e49daa8b | |
| parent | 0265eaa500aa01e5328989b5cd814db7234f3777 (diff) | |
[5.0.x] 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.
Backport of 8b1acc0440418ac8f45ba48e2dfcf5126c83341b from main
| -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 b38f8f64ef..d38093bfed 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -1081,7 +1081,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 e1e3c7d3c6..5488013bfc 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -850,6 +850,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) |
