Skip to content

Commit f034cb5

Browse files
committed
Encode django QuerySets to lists and not dicts in JSONEncoder
1 parent 71c03b9 commit f034cb5

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

rest_framework/tests/test_renderers.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from decimal import Decimal
55
from django.core.cache import cache
6+
from django.db import models
67
from django.test import TestCase
78
from django.utils import unittest
89
from django.utils.translation import ugettext_lazy as _
@@ -34,6 +35,10 @@
3435
]
3536

3637

38+
class DummyTestModel(models.Model):
39+
name = models.CharField(max_length=42, default='')
40+
41+
3742
class BasicRendererTests(TestCase):
3843
def test_expected_results(self):
3944
for value, renderer_cls, expected in expected_results:
@@ -276,6 +281,20 @@ def test_render_lazy_strings(self):
276281
ret = JSONRenderer().render(_('test'))
277282
self.assertEqual(ret, b'"test"')
278283

284+
def test_render_queryset_values(self):
285+
o = DummyTestModel.objects.create(name='dummy')
286+
qs = DummyTestModel.objects.values('id', 'name')
287+
ret = JSONRenderer().render(qs)
288+
data = json.loads(ret.decode('utf-8'))
289+
self.assertEquals(data, [{'id': o.id, 'name': o.name}])
290+
291+
def test_render_queryset_values_list(self):
292+
o = DummyTestModel.objects.create(name='dummy')
293+
qs = DummyTestModel.objects.values_list('id', 'name')
294+
ret = JSONRenderer().render(qs)
295+
data = json.loads(ret.decode('utf-8'))
296+
self.assertEquals(data, [[o.id, o.name]])
297+
279298
def test_render_dict_abc_obj(self):
280299
class Dict(MutableMapping):
281300
def __init__(self):

rest_framework/utils/encoders.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
Helper classes for parsers.
33
"""
44
from __future__ import unicode_literals
5+
from django.db.models.query import QuerySet
56
from django.utils.datastructures import SortedDict
67
from django.utils.functional import Promise
78
from rest_framework.compat import timezone, force_text
@@ -42,6 +43,8 @@ def default(self, o):
4243
return str(o.total_seconds())
4344
elif isinstance(o, decimal.Decimal):
4445
return str(o)
46+
elif isinstance(o, QuerySet):
47+
return list(o)
4548
elif hasattr(o, 'tolist'):
4649
return o.tolist()
4750
elif hasattr(o, '__getitem__'):

0 commit comments

Comments
 (0)