mirror of
https://github.com/django/django.git
synced 2025-08-01 09:32:50 +00:00
[2.2.x] Fixed #30335, #29139 -- Fixed crash when ordering or aggregating over a nested JSONField key transform.
Backport of d87bd29c4f
from master.
This commit is contained in:
parent
ef38777ee8
commit
e85317d731
3 changed files with 36 additions and 5 deletions
|
@ -1,10 +1,11 @@
|
|||
import datetime
|
||||
import operator
|
||||
import uuid
|
||||
from decimal import Decimal
|
||||
|
||||
from django.core import checks, exceptions, serializers
|
||||
from django.core.serializers.json import DjangoJSONEncoder
|
||||
from django.db.models import Q
|
||||
from django.db.models import Count, Q
|
||||
from django.forms import CharField, Form, widgets
|
||||
from django.test.utils import isolate_apps
|
||||
from django.utils.html import escape
|
||||
|
@ -15,6 +16,7 @@ from .models import JSONModel, PostgreSQLModel
|
|||
try:
|
||||
from django.contrib.postgres import forms
|
||||
from django.contrib.postgres.fields import JSONField
|
||||
from django.contrib.postgres.fields.jsonb import KeyTextTransform, KeyTransform
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
@ -153,6 +155,27 @@ class TestQuerying(PostgreSQLTestCase):
|
|||
query = JSONModel.objects.filter(field__name__isnull=False).order_by('field__ord')
|
||||
self.assertSequenceEqual(query, [objs[4], objs[2], objs[3], objs[1], objs[0]])
|
||||
|
||||
def test_ordering_grouping_by_key_transform(self):
|
||||
base_qs = JSONModel.objects.filter(field__d__0__isnull=False)
|
||||
for qs in (
|
||||
base_qs.order_by('field__d__0'),
|
||||
base_qs.annotate(key=KeyTransform('0', KeyTransform('d', 'field'))).order_by('key'),
|
||||
):
|
||||
self.assertSequenceEqual(qs, [self.objs[8]])
|
||||
qs = JSONModel.objects.filter(field__isnull=False)
|
||||
self.assertQuerysetEqual(
|
||||
qs.values('field__d__0').annotate(count=Count('field__d__0')).order_by('count'),
|
||||
[1, 10],
|
||||
operator.itemgetter('count'),
|
||||
)
|
||||
self.assertQuerysetEqual(
|
||||
qs.filter(field__isnull=False).annotate(
|
||||
key=KeyTextTransform('f', KeyTransform('1', KeyTransform('d', 'field'))),
|
||||
).values('key').annotate(count=Count('key')).order_by('count'),
|
||||
[(None, 0), ('g', 1)],
|
||||
operator.itemgetter('key', 'count'),
|
||||
)
|
||||
|
||||
def test_deep_values(self):
|
||||
query = JSONModel.objects.values_list('field__k__l')
|
||||
self.assertSequenceEqual(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue