mirror of
https://github.com/django/django.git
synced 2025-10-24 14:16:09 +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:
committed by
Mariusz Felisiak
parent
2b582387d5
commit
3434dbd39d
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user