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:
committed by
Mariusz Felisiak
parent
cafe7266ee
commit
f333e3513e
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user