summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Melchiorre <paolo@melchiorre.org>2023-09-27 22:24:04 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-09-28 08:12:39 +0200
commit0f9d07398d487868f3ac9bc2e2dd3efef984a49c (patch)
tree72c5f5883f0cabbdcd220511d5727a909bb8a520
parent0ca421c5aa271d9d35b0f7932a464e10382070c9 (diff)
[5.0.x] Fixed #34877 -- Fixed migrations crash when adding GeneratedField with output_field with params.
Backport of e7e8eb44a30bcab004a582760752b5eb3fcd6e91 from main
-rw-r--r--django/db/models/fields/generated.py3
-rw-r--r--tests/model_fields/test_generatedfield.py7
-rw-r--r--tests/schema/tests.py20
3 files changed, 29 insertions, 1 deletions
diff --git a/django/db/models/fields/generated.py b/django/db/models/fields/generated.py
index 225d3e9d12..abafc3ad27 100644
--- a/django/db/models/fields/generated.py
+++ b/django/db/models/fields/generated.py
@@ -159,3 +159,6 @@ class GeneratedField(Field):
def db_parameters(self, connection):
return self.output_field.db_parameters(connection)
+
+ def db_type_parameters(self, connection):
+ return self.output_field.db_type_parameters(connection)
diff --git a/tests/model_fields/test_generatedfield.py b/tests/model_fields/test_generatedfield.py
index 3184f77d87..d965940465 100644
--- a/tests/model_fields/test_generatedfield.py
+++ b/tests/model_fields/test_generatedfield.py
@@ -181,6 +181,13 @@ class GeneratedFieldTestMixin:
field._resolved_expression.output_field.db_type(connection),
)
+ @skipUnlessDBFeature("supports_collation_on_charfield")
+ def test_db_type_parameters(self):
+ db_type_parameters = self.output_field_model._meta.get_field(
+ "lower_name"
+ ).db_type_parameters(connection)
+ self.assertEqual(db_type_parameters["max_length"], 11)
+
def test_model_with_params(self):
m = self.params_model.objects.create()
m = self._refresh_if_needed(m)
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index cc92e250a1..166fe7048a 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -2,6 +2,7 @@ import datetime
import itertools
import unittest
from copy import copy
+from decimal import Decimal
from unittest import mock
from django.core.exceptions import FieldError
@@ -52,7 +53,7 @@ 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, Upper
+from django.db.models.functions import Abs, Cast, Collate, Lower, Random, Round, Upper
from django.db.models.indexes import IndexExpression
from django.db.transaction import TransactionManagementError, atomic
from django.test import (
@@ -836,6 +837,23 @@ class SchemaTests(TransactionTestCase):
)
@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)
+ vat_price = GeneratedField(
+ expression=Round(F("price") * Value(Decimal("1.22")), 2),
+ db_persist=True,
+ output_field=DecimalField(max_digits=8, decimal_places=2),
+ )
+
+ class Meta:
+ app_label = "schema"
+
+ with connection.schema_editor() as editor:
+ editor.create_model(GeneratedFieldOutputFieldModel)
+
+ @isolate_apps("schema")
def test_add_auto_field(self):
class AddAutoFieldModel(Model):
name = CharField(max_length=255, primary_key=True)