summaryrefslogtreecommitdiff
path: root/django/db/models/fields/json.py
diff options
context:
space:
mode:
authorJacob Walls <jacobtylerwalls@gmail.com>2025-02-16 21:35:12 -0500
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-02-18 17:28:24 +0100
commit0bf412111be686b6b23e00863f5d449d63557dbf (patch)
tree549c19f89fa6b93369cb8c2a0a938ef1c668f2a7 /django/db/models/fields/json.py
parent9d22a7d8f0e814a596ecbeb6efd051262f6a03e3 (diff)
Fixed #35167 -- Delegated to super() in JSONField.get_db_prep_save().
Avoids reports of bulk_update() sending Cast expressions to JSONField.get_prep_value(). Co-authored-by: Simon Charette <charette.s@gmail.com>
Diffstat (limited to 'django/db/models/fields/json.py')
-rw-r--r--django/db/models/fields/json.py19
1 files changed, 12 insertions, 7 deletions
diff --git a/django/db/models/fields/json.py b/django/db/models/fields/json.py
index 8d743c436a..188fcf520c 100644
--- a/django/db/models/fields/json.py
+++ b/django/db/models/fields/json.py
@@ -99,18 +99,23 @@ class JSONField(CheckFieldDefaultMixin, Field):
def get_db_prep_value(self, value, connection, prepared=False):
if not prepared:
value = self.get_prep_value(value)
- if isinstance(value, expressions.Value) and isinstance(
- value.output_field, JSONField
- ):
- value = value.value
- elif hasattr(value, "as_sql"):
- return value
return connection.ops.adapt_json_value(value, self.encoder)
def get_db_prep_save(self, value, connection):
+ # This slightly involved logic is to allow for `None` to be used to
+ # store SQL `NULL` while `Value(None, JSONField())` can be used to
+ # store JSON `null` while preventing compilable `as_sql` values from
+ # making their way to `get_db_prep_value`, which is what the `super()`
+ # implementation does.
if value is None:
return value
- return self.get_db_prep_value(value, connection)
+ if (
+ isinstance(value, expressions.Value)
+ and value.value is None
+ and isinstance(value.output_field, JSONField)
+ ):
+ value = None
+ return super().get_db_prep_save(value, connection)
def get_transform(self, name):
transform = super().get_transform(name)