From be7f68422d4c6ae568a17f1fa91aac67d284df82 Mon Sep 17 00:00:00 2001 From: Clifford Gama Date: Tue, 21 Oct 2025 11:34:58 +0200 Subject: Refs #35381 -- Delegated ArrayField element prepping to base_field.get_db_prep_save. Previously, ArrayField always used base_field.get_db_prep_value when saving, which could differ from how base_field prepares data for save. This change overrides ArrayField.get_db_prep_save to delegate to the base_field's get_db_prep_save, ensuring elements like None in JSONField arrays are saved correctly as SQL NULL instead of JSON null. --- django/contrib/postgres/fields/array.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'django/contrib/postgres/fields/array.py') diff --git a/django/contrib/postgres/fields/array.py b/django/contrib/postgres/fields/array.py index 078428416c..a76598a9bf 100644 --- a/django/contrib/postgres/fields/array.py +++ b/django/contrib/postgres/fields/array.py @@ -135,6 +135,11 @@ class ArrayField(CheckPostgresInstalledMixin, CheckFieldDefaultMixin, Field): ] return value + def get_db_prep_save(self, value, connection): + if isinstance(value, (list, tuple)): + return [self.base_field.get_db_prep_save(i, connection) for i in value] + return value + def deconstruct(self): name, path, args, kwargs = super().deconstruct() if path == "django.contrib.postgres.fields.array.ArrayField": -- cgit v1.3