1
0
mirror of https://github.com/django/django.git synced 2025-10-31 09:41:08 +00:00

[5.0.x] Fixed #35336 -- Addressed crash when adding a GeneratedField with % literals.

A longer term solution is likely to have a better separation of parametrized
DDL altogether to handle checks, constraints, defaults, and generated fields
but such a change would require a significant refactor that isn't suitable
for a backport.

Thanks Adrian Garcia for the report.

Backport of 888b9042b3 from main
This commit is contained in:
Simon Charette
2024-04-02 16:33:31 -04:00
committed by Natalia
parent 14ab15d69a
commit fead2dd523
4 changed files with 62 additions and 13 deletions

View File

@@ -54,7 +54,16 @@ from django.db.models import (
Value,
)
from django.db.models.fields.json import KT, KeyTextTransform
from django.db.models.functions import Abs, Cast, Collate, Lower, Random, Round, Upper
from django.db.models.functions import (
Abs,
Cast,
Collate,
Concat,
Lower,
Random,
Round,
Upper,
)
from django.db.models.indexes import IndexExpression
from django.db.transaction import TransactionManagementError, atomic
from django.test import (
@@ -892,6 +901,39 @@ class SchemaTests(TransactionTestCase):
with connection.schema_editor() as editor:
editor.create_model(GeneratedFieldOutputFieldModel)
@isolate_apps("schema")
@skipUnlessDBFeature("supports_stored_generated_columns")
def test_add_generated_field_contains(self):
class GeneratedFieldContainsModel(Model):
text = TextField(default="foo")
generated = GeneratedField(
expression=Concat("text", Value("%")),
db_persist=True,
output_field=TextField(),
)
class Meta:
app_label = "schema"
with connection.schema_editor() as editor:
editor.create_model(GeneratedFieldContainsModel)
field = GeneratedField(
expression=Q(text__icontains="FOO"),
db_persist=True,
output_field=BooleanField(),
)
field.contribute_to_class(GeneratedFieldContainsModel, "contains_foo")
with connection.schema_editor() as editor:
editor.add_field(GeneratedFieldContainsModel, field)
obj = GeneratedFieldContainsModel.objects.create()
obj.refresh_from_db()
self.assertEqual(obj.text, "foo")
self.assertEqual(obj.generated, "foo%")
self.assertIs(obj.contains_foo, True)
@isolate_apps("schema")
def test_add_auto_field(self):
class AddAutoFieldModel(Model):