1
0
mirror of https://github.com/django/django.git synced 2025-10-23 21:59:11 +00:00

Fixed #34754 -- Fixed JSONField check constraints validation on NULL values.

The __isnull lookup of JSONField must special case
Value(None, JSONField()) left-hand-side in order to be coherent with
its convoluted null handling.

Since psycopg>=3 offers no way to pass a NULL::jsonb the issue is
resolved by optimizing IsNull(Value(None), True | False) to
True | False.

Regression in 5c23d9f0c3.

Thanks Alexandre Collet for the report.
This commit is contained in:
Simon Charette
2023-08-02 20:47:49 -04:00
committed by Mariusz Felisiak
parent 2b582387d5
commit 3434dbd39d
4 changed files with 35 additions and 1 deletions

View File

@@ -13,6 +13,7 @@ from django.utils.deprecation import RemovedInDjango60Warning
from .models import (
ChildModel,
ChildUniqueConstraintProduct,
JSONFieldModel,
Product,
UniqueConstraintConditionProduct,
UniqueConstraintDeferrable,
@@ -332,6 +333,25 @@ class CheckConstraintTests(TestCase):
)
constraint.validate(Product, Product())
@skipUnlessDBFeature("supports_json_field")
def test_validate_nullable_jsonfield(self):
is_null_constraint = models.CheckConstraint(
check=models.Q(data__isnull=True),
name="nullable_data",
)
is_not_null_constraint = models.CheckConstraint(
check=models.Q(data__isnull=False),
name="nullable_data",
)
is_null_constraint.validate(JSONFieldModel, JSONFieldModel(data=None))
msg = f"Constraint “{is_null_constraint.name}” is violated."
with self.assertRaisesMessage(ValidationError, msg):
is_null_constraint.validate(JSONFieldModel, JSONFieldModel(data={}))
msg = f"Constraint “{is_not_null_constraint.name}” is violated."
with self.assertRaisesMessage(ValidationError, msg):
is_not_null_constraint.validate(JSONFieldModel, JSONFieldModel(data=None))
is_not_null_constraint.validate(JSONFieldModel, JSONFieldModel(data={}))
class UniqueConstraintTests(TestCase):
@classmethod