1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

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

This commit is contained in:
Paolo Melchiorre 2023-09-27 22:24:04 +02:00 committed by Mariusz Felisiak
parent 5e4b75b78a
commit e7e8eb44a3
3 changed files with 29 additions and 1 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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):