[3.0.x] Fixed #30826 -- Fixed crash of many JSONField lookups when one hand side is key transform.
Regression in6c3dfba892
. Backport of7d1bf29977
from master
This commit is contained in:
parent
c1cfec6b50
commit
cf7ef5d258
|
@ -8,7 +8,7 @@ class PostgresSimpleLookup(FieldGetDbPrepValueMixin, Lookup):
|
|||
def as_sql(self, qn, connection):
|
||||
lhs, lhs_params = self.process_lhs(qn, connection)
|
||||
rhs, rhs_params = self.process_rhs(qn, connection)
|
||||
params = lhs_params + rhs_params
|
||||
params = tuple(lhs_params) + tuple(rhs_params)
|
||||
return '%s %s %s' % (lhs, self.operator, rhs), params
|
||||
|
||||
|
||||
|
|
|
@ -9,4 +9,7 @@ Django 1.11.26 fixes a regression in 1.11.25.
|
|||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed a crash when using a ``contains``, ``contained_by``, ``has_key``,
|
||||
``has_keys``, or ``has_any_keys`` lookup on
|
||||
:class:`~django.contrib.postgres.fields.JSONField`, if the right or left hand
|
||||
side of an expression is a key transform (:ticket:`30826`).
|
||||
|
|
|
@ -9,4 +9,7 @@ Django 2.1.14 fixes a regression in 2.1.13.
|
|||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed a crash when using a ``contains``, ``contained_by``, ``has_key``,
|
||||
``has_keys``, or ``has_any_keys`` lookup on
|
||||
:class:`~django.contrib.postgres.fields.JSONField`, if the right or left hand
|
||||
side of an expression is a key transform (:ticket:`30826`).
|
||||
|
|
|
@ -9,4 +9,7 @@ Django 2.2.7 fixes several bugs in 2.2.6.
|
|||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed a crash when using a ``contains``, ``contained_by``, ``has_key``,
|
||||
``has_keys``, or ``has_any_keys`` lookup on
|
||||
:class:`~django.contrib.postgres.fields.JSONField`, if the right or left hand
|
||||
side of an expression is a key transform (:ticket:`30826`).
|
||||
|
|
|
@ -135,7 +135,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):
|
||||
|
@ -386,6 +391,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):
|
||||
|
|
Loading…
Reference in New Issue