diff options
| author | Clifford Gama <cliffygamy@gmail.com> | 2025-10-21 11:34:58 +0200 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-10-29 15:00:52 -0400 |
| commit | be7f68422d4c6ae568a17f1fa91aac67d284df82 (patch) | |
| tree | ff051b66bd991593959d3dd4d39e7e3d71a95ba0 /tests/postgres_tests | |
| parent | adc25a9a6696f7e2ab6181aabce3a23e027d6703 (diff) | |
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.
Diffstat (limited to 'tests/postgres_tests')
| -rw-r--r-- | tests/postgres_tests/models.py | 2 | ||||
| -rw-r--r-- | tests/postgres_tests/test_array.py | 27 |
2 files changed, 28 insertions, 1 deletions
diff --git a/tests/postgres_tests/models.py b/tests/postgres_tests/models.py index f07f4492b8..6a3d25a6af 100644 --- a/tests/postgres_tests/models.py +++ b/tests/postgres_tests/models.py @@ -79,7 +79,7 @@ class OtherTypesArrayModel(PostgreSQLModel): models.DecimalField(max_digits=5, decimal_places=2), default=list ) tags = ArrayField(TagField(), blank=True, null=True) - json = ArrayField(models.JSONField(default=dict), default=list) + json = ArrayField(models.JSONField(default=dict), default=list, null=True) int_ranges = ArrayField(IntegerRangeField(), blank=True, null=True) bigint_ranges = ArrayField(BigIntegerRangeField(), blank=True, null=True) diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py index 392b8f946c..e65009ad83 100644 --- a/tests/postgres_tests/test_array.py +++ b/tests/postgres_tests/test_array.py @@ -10,6 +10,7 @@ from django.core import checks, exceptions, serializers, validators from django.core.exceptions import FieldError from django.core.management import call_command from django.db import IntegrityError, connection, models +from django.db.models import JSONNull from django.db.models.expressions import Exists, F, OuterRef, RawSQL, Value from django.db.models.functions import Cast, JSONObject, Upper from django.test import TransactionTestCase, override_settings, skipUnlessDBFeature @@ -1577,3 +1578,29 @@ class TestAdminUtils(PostgreSQLTestCase): self.empty_value, ) self.assertEqual(display_value, self.empty_value) + + +class TestJSONFieldQuerying(PostgreSQLTestCase): + def test_saving_and_querying_for_sql_null(self): + obj = OtherTypesArrayModel.objects.create(json=[None, None]) + self.assertSequenceEqual( + OtherTypesArrayModel.objects.filter(json__1__isnull=True), [obj] + ) + + def test_saving_and_querying_for_json_null(self): + obj = OtherTypesArrayModel.objects.create(json=[JSONNull(), JSONNull()]) + self.assertSequenceEqual( + OtherTypesArrayModel.objects.filter(json__1=JSONNull()), [obj] + ) + self.assertSequenceEqual( + OtherTypesArrayModel.objects.filter(json__1__isnull=True), [] + ) + + def test_saving_and_querying_for_nested_json_nulls(self): + obj = OtherTypesArrayModel.objects.create(json=[[None, 1], [None, 2]]) + self.assertSequenceEqual( + OtherTypesArrayModel.objects.filter(json__1__0=None), [obj] + ) + self.assertSequenceEqual( + OtherTypesArrayModel.objects.filter(json__1__0__isnull=True), [] + ) |
