[2.2.x] Fixed #30826 -- Fixed crash of many JSONField lookups when one hand side is key transform.

Regression in 6c3dfba892.

Backport of 7d1bf29977 from master
This commit is contained in:
Louise Grandjonc 2019-10-01 16:25:40 -07:00 committed by Mariusz Felisiak
parent 4f7ba25e67
commit 323467e286
5 changed files with 39 additions and 5 deletions

View file

@ -126,7 +126,12 @@ class TestQuerying(PostgreSQLTestCase):
'k': True,
'l': False,
}),
JSONModel(field={'foo': 'bar'}),
JSONModel(field={
'foo': 'bar',
'baz': {'a': 'b', 'c': 'd'},
'bar': ['foo', 'bar'],
'bax': {'foo': 'bar'},
}),
])
def test_exact(self):
@ -361,6 +366,26 @@ class TestQuerying(PostgreSQLTestCase):
queries[0]['sql'],
)
def test_lookups_with_key_transform(self):
tests = (
('field__d__contains', 'e'),
('field__baz__contained_by', {'a': 'b', 'c': 'd', 'e': 'f'}),
('field__baz__has_key', 'c'),
('field__baz__has_keys', ['a', 'c']),
('field__baz__has_any_keys', ['a', 'x']),
('field__contains', KeyTransform('bax', 'field')),
(
'field__contained_by',
KeyTransform('x', RawSQL('%s::jsonb', ['{"x": {"a": "b", "c": 1, "d": "e"}}'])),
),
('field__has_key', KeyTextTransform('foo', 'field')),
)
for lookup, value in tests:
with self.subTest(lookup=lookup):
self.assertTrue(JSONModel.objects.filter(
**{lookup: value},
).exists())
@isolate_apps('postgres_tests')
class TestChecks(PostgreSQLSimpleTestCase):