summaryrefslogtreecommitdiff
path: root/tests/postgres_tests
diff options
context:
space:
mode:
authorcan <cansarigol@derinbilgi.com.tr>2019-04-17 09:24:28 +0300
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-04-18 07:16:50 +0200
commitd87bd29c4f8dfcdf3f4a4eb8340e6770a2416fe3 (patch)
treee878f4755bbca1aa82d95fe780ed88331f20ddf1 /tests/postgres_tests
parentf110de5c04818b8f915dcf65da37a50c1424c6e6 (diff)
Fixed #30335, #29139 -- Fixed crash when ordering or aggregating over a nested JSONField key transform.
Diffstat (limited to 'tests/postgres_tests')
-rw-r--r--tests/postgres_tests/test_json.py25
1 files changed, 24 insertions, 1 deletions
diff --git a/tests/postgres_tests/test_json.py b/tests/postgres_tests/test_json.py
index eab7f8a272..ee0bb6d5ea 100644
--- a/tests/postgres_tests/test_json.py
+++ b/tests/postgres_tests/test_json.py
@@ -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
@@ -162,6 +164,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(