1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

Fixed #31300 -- Added GeneratedField model field.

Thanks Adam Johnson and Paolo Melchiorre for reviews.

Co-Authored-By: Lily Foote <code@lilyf.org>
Co-Authored-By: Mariusz Felisiak <felisiak.mariusz@gmail.com>
This commit is contained in:
Jeremy Nauta
2023-07-06 20:36:48 -06:00
committed by Mariusz Felisiak
parent cafe7266ee
commit f333e3513e
22 changed files with 807 additions and 11 deletions

View File

@@ -1226,3 +1226,115 @@ class InvalidDBDefaultTests(TestCase):
msg = f"{expression} cannot be used in db_default."
expected_error = Error(msg=msg, obj=field, id="fields.E012")
self.assertEqual(errors, [expected_error])
@isolate_apps("invalid_models_tests")
class GeneratedFieldTests(TestCase):
def test_not_supported(self):
db_persist = connection.features.supports_stored_generated_columns
class Model(models.Model):
name = models.IntegerField()
field = models.GeneratedField(
expression=models.F("name"), db_persist=db_persist
)
expected_errors = []
if (
not connection.features.supports_stored_generated_columns
and not connection.features.supports_virtual_generated_columns
):
expected_errors.append(
Error(
f"{connection.display_name} does not support GeneratedFields.",
obj=Model._meta.get_field("field"),
id="fields.E220",
)
)
if (
not db_persist
and not connection.features.supports_virtual_generated_columns
):
expected_errors.append(
Error(
f"{connection.display_name} does not support non-persisted "
"GeneratedFields.",
obj=Model._meta.get_field("field"),
id="fields.E221",
hint="Set db_persist=True on the field.",
),
)
self.assertEqual(
Model._meta.get_field("field").check(databases={"default"}),
expected_errors,
)
def test_not_supported_stored_required_db_features(self):
class Model(models.Model):
name = models.IntegerField()
field = models.GeneratedField(expression=models.F("name"), db_persist=True)
class Meta:
required_db_features = {"supports_stored_generated_columns"}
self.assertEqual(Model.check(databases=self.databases), [])
def test_not_supported_virtual_required_db_features(self):
class Model(models.Model):
name = models.IntegerField()
field = models.GeneratedField(expression=models.F("name"), db_persist=False)
class Meta:
required_db_features = {"supports_virtual_generated_columns"}
self.assertEqual(Model.check(databases=self.databases), [])
@skipUnlessDBFeature("supports_stored_generated_columns")
def test_not_supported_virtual(self):
class Model(models.Model):
name = models.IntegerField()
field = models.GeneratedField(expression=models.F("name"), db_persist=False)
a = models.TextField()
excepted_errors = (
[]
if connection.features.supports_virtual_generated_columns
else [
Error(
f"{connection.display_name} does not support non-persisted "
"GeneratedFields.",
obj=Model._meta.get_field("field"),
id="fields.E221",
hint="Set db_persist=True on the field.",
),
]
)
self.assertEqual(
Model._meta.get_field("field").check(databases={"default"}),
excepted_errors,
)
@skipUnlessDBFeature("supports_virtual_generated_columns")
def test_not_supported_stored(self):
class Model(models.Model):
name = models.IntegerField()
field = models.GeneratedField(expression=models.F("name"), db_persist=True)
a = models.TextField()
expected_errors = (
[]
if connection.features.supports_stored_generated_columns
else [
Error(
f"{connection.display_name} does not support persisted "
"GeneratedFields.",
obj=Model._meta.get_field("field"),
id="fields.E222",
hint="Set db_persist=False on the field.",
),
]
)
self.assertEqual(
Model._meta.get_field("field").check(databases={"default"}),
expected_errors,
)