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:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user