#36418: bulk_update None on JSON field sets the value as "null" string in
Postgresql
-------------------------------------+-------------------------------------
Reporter: Amit Maniar | Owner: (none)
Type: Bug | Status: new
Component: Database layer | Version: 5.2
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Clifford Gama):
Hello, Amit. Thanks for taking the time to create this ticket.
I can't reproduce with:
{{{#!diff
diff --git a/tests/queries/models.py b/tests/queries/models.py
index 9f4cf040b6..420b7fee30 100644
--- a/tests/queries/models.py
+++ b/tests/queries/models.py
@@ -789,3 +789,10 @@ class JSONFieldNullable(models.Model):
class Meta:
required_db_features = {"supports_json_field"}
+
+
+class NonNullableJSONModel(models.Model):
+ json_field = models.JSONField(null=False)
+
+ class Meta:
+ required_db_features = {"supports_json_field"}
diff --git a/tests/queries/test_bulk_update.py
b/tests/queries/test_bulk_update.py
index 765fa934ca..77f90c5082 100644
--- a/tests/queries/test_bulk_update.py
+++ b/tests/queries/test_bulk_update.py
@@ -26,6 +26,7 @@ from .models import (
SpecialCategory,
Tag,
Valid,
+ NonNullableJSONModel
)
@@ -300,6 +301,17 @@ class BulkUpdateTests(TestCase):
JSONFieldNullable.objects.filter(json_field__has_key="c"),
objs
)
+ @skipUnlessDBFeature("supports_json_field")
+ @override_settings(DEBUG=True)
+ def test_non_nullable_json_field(self):
+ obj = NonNullableJSONModel.objects.create(json_field={"k":
"val"})
+ obj.json_field = None
+ NonNullableJSONModel.objects.bulk_update([obj], ["json_field"])
+ self.assertIsNone(obj.json_field)
+ sql = connection.queries[-1]["sql"].lower()
+ self.assertIn("'null'::jsonb", sql)
+ self.assertNotIn("'\"null\"'::jsonb", sql)
+
def test_nullable_fk_after_related_save(self):
parent = RelatedObject.objects.create()
child = SingleObject()
}}}
on PostgreSQL 16.8 and Django's main branch. I get a JSON null instead of
a `"null"` string. Which is surprising since JSON null is supposed to be
stored through `Value(None, JSONField())`
[
https://docs.djangoproject.com/en/5.2/topics/db/queries/#storing-and-
querying-for-none as documented here]. I'd have expected this to use SQL
`NULL` instead, raising `IntegrityError`, like `update()` and `save()`.
--
Ticket URL: <
https://code.djangoproject.com/ticket/36418#comment:1>