summaryrefslogtreecommitdiff
path: root/tests/model_fields/models.py
diff options
context:
space:
mode:
authorMark Gensler <mark.gensler@protonmail.com>2024-06-25 15:04:48 +0100
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-07-04 11:47:20 +0200
commit2da007737cda936ef2ee87271bf9e69eb93cd3fe (patch)
tree154dd2a4d8737327339ee73db12dfea4ff15e3a2 /tests/model_fields/models.py
parent3b5d04f879f6d3d8ff7f5d82b4a7c801b71b2fd0 (diff)
[5.1.x] Fixed #35560 -- Made Model.full_clean() ignore GeneratedFields for constraints.
Accessing generated field values on unsaved models caused a crash when validating CheckConstraints and UniqueConstraints with expressions. Backport of 1005c2abd1ef0c156f449641e38c33e473989d37 from main.
Diffstat (limited to 'tests/model_fields/models.py')
-rw-r--r--tests/model_fields/models.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py
index 652c808b40..d9811ba164 100644
--- a/tests/model_fields/models.py
+++ b/tests/model_fields/models.py
@@ -609,3 +609,79 @@ class GeneratedModelNullVirtual(models.Model):
class Meta:
required_db_features = {"supports_virtual_generated_columns"}
+
+
+class GeneratedModelBase(models.Model):
+ a = models.IntegerField()
+ a_squared = models.GeneratedField(
+ expression=F("a") * F("a"),
+ output_field=models.IntegerField(),
+ db_persist=True,
+ )
+
+ class Meta:
+ abstract = True
+
+
+class GeneratedModelVirtualBase(models.Model):
+ a = models.IntegerField()
+ a_squared = models.GeneratedField(
+ expression=F("a") * F("a"),
+ output_field=models.IntegerField(),
+ db_persist=False,
+ )
+
+ class Meta:
+ abstract = True
+
+
+class GeneratedModelCheckConstraint(GeneratedModelBase):
+ class Meta:
+ required_db_features = {
+ "supports_stored_generated_columns",
+ "supports_table_check_constraints",
+ }
+ constraints = [
+ models.CheckConstraint(
+ condition=models.Q(a__gt=0),
+ name="Generated model check constraint a > 0",
+ )
+ ]
+
+
+class GeneratedModelCheckConstraintVirtual(GeneratedModelVirtualBase):
+ class Meta:
+ required_db_features = {
+ "supports_virtual_generated_columns",
+ "supports_table_check_constraints",
+ }
+ constraints = [
+ models.CheckConstraint(
+ condition=models.Q(a__gt=0),
+ name="Generated model check constraint virtual a > 0",
+ )
+ ]
+
+
+class GeneratedModelUniqueConstraint(GeneratedModelBase):
+ class Meta:
+ required_db_features = {
+ "supports_stored_generated_columns",
+ "supports_table_check_constraints",
+ }
+ constraints = [
+ models.UniqueConstraint(F("a"), name="Generated model unique constraint a"),
+ ]
+
+
+class GeneratedModelUniqueConstraintVirtual(GeneratedModelVirtualBase):
+ class Meta:
+ required_db_features = {
+ "supports_virtual_generated_columns",
+ "supports_expression_indexes",
+ }
+ constraints = [
+ models.UniqueConstraint(
+ F("a"), name="Generated model unique constraint virtual a"
+ ),
+ ]