#36518: full_clean crashes on model with both a CheckConstraint and a
GeneratedField with a Case expression
-------------------------------------+-------------------------------------
     Reporter:  Olivier Dalang       |                    Owner:  Simon
                                     |  Charette
         Type:  Bug                  |                   Status:  assigned
    Component:  Database layer       |                  Version:  5.2
  (models, ORM)                      |
     Severity:  Release blocker      |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Comment (by Sarah Boyce):

 Tried to look into this today a bit, note that the following is a possible
 regression test:
 {{{#!diff
 --- a/tests/constraints/models.py
 +++ b/tests/constraints/models.py
 @@ -69,6 +69,29 @@ class GeneratedFieldVirtualProduct(models.Model):
          required_db_features = {"supports_virtual_generated_columns"}


 +class GeneratedFieldCaseWhenConstraint(models.Model):
 +    age = models.IntegerField()
 +    is_old_enough = models.GeneratedField(
 +        expression=models.Case(
 +            models.When(age__gte=18, then=models.Value(True)),
 +            default=models.Value(False),
 +        ),
 +        db_persist=True,
 +        output_field=models.BooleanField(),
 +    )
 +
 +    class Meta:
 +        required_db_features = {
 +            "supports_stored_generated_columns",
 +            "supports_table_check_constraints"
 +        }
 +        constraints = [
 +            models.CheckConstraint(
 +                name="age_valid", condition=models.Q(age__lt=100)
 +            ),
 +        ]
 +
 +
  class UniqueConstraintProduct(models.Model):
      name = models.CharField(max_length=255)
      color = models.CharField(max_length=32, null=True)
 diff --git a/tests/constraints/tests.py b/tests/constraints/tests.py
 index bff8de8566..f13845c5d5 100644
 --- a/tests/constraints/tests.py
 +++ b/tests/constraints/tests.py
 @@ -12,6 +12,7 @@ from django.test import SimpleTestCase, TestCase,
 skipIfDBFeature, skipUnlessDBF
  from .models import (
      ChildModel,
      ChildUniqueConstraintProduct,
 +    GeneratedFieldCaseWhenConstraint,
      GeneratedFieldStoredProduct,
      GeneratedFieldVirtualProduct,
      JSONFieldModel,
 @@ -414,6 +415,15 @@ class CheckConstraintTests(TestCase):
          constraint.validate(model, invalid_product, exclude={"price"})
          constraint.validate(model, invalid_product, exclude={"rebate"})

 +    @skipUnlessDBFeature(
 +        "supports_stored_generated_columns",
 "supports_table_check_constraints"
 +    )
 +    def test_full_clean_generated_field_case_when(self):
 +        bob = GeneratedFieldCaseWhenConstraint(age=17)
 +        bob.full_clean()
 +        bob.save()
 +        self.assertEqual(bob.is_old_enough, False)
 +
      def test_database_default(self):
          models.CheckConstraint(
 }}}

 This test fails on main but passes once the current fix for #34871
 (current PR https://github.com/django/django/pull/19190) is applied
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36518#comment:5>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/010701985ba5b7ed-c8ab77d3-b896-4a51-967c-4235fe6f2f3b-000000%40eu-central-1.amazonses.com.

Reply via email to