Ver código fonte

Fixed #34877 -- Fixed migrations crash when adding GeneratedField with output_field with params.

Paolo Melchiorre 1 ano atrás
pai
commit
e7e8eb44a3

+ 3 - 0
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)

+ 7 - 0
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)

+ 19 - 1
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 TransactionTestCase, skipIfDBFeature, skipUnlessDBFeature
@@ -829,6 +830,23 @@ class SchemaTests(TransactionTestCase):
             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)
+            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):