summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBerker Peksag <berker.peksag@gmail.com>2016-06-08 04:22:30 +0300
committerTim Graham <timograham@gmail.com>2016-06-08 11:08:18 -0400
commit724dd2043ec849e605ba4f4cf1430458c2a8d90a (patch)
treebd6afc8350d9145b0e447ee80b3cc87b9cbb56ba
parent7767978beec6098baea75d50a191a3b8224e729f (diff)
Fixed #26717 -- Added Serializer.stream_class to customize the stream.
-rw-r--r--django/core/serializers/base.py3
-rw-r--r--docs/releases/1.11.txt3
-rw-r--r--tests/serializers/tests.py23
3 files changed, 27 insertions, 2 deletions
diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py
index 7cf66b15f7..a6c8847278 100644
--- a/django/core/serializers/base.py
+++ b/django/core/serializers/base.py
@@ -59,6 +59,7 @@ class Serializer(object):
# internal Django use.
internal_use_only = False
progress_class = ProgressBar
+ stream_class = six.StringIO
def serialize(self, queryset, **options):
"""
@@ -66,7 +67,7 @@ class Serializer(object):
"""
self.options = options
- self.stream = options.pop("stream", six.StringIO())
+ self.stream = options.pop("stream", self.stream_class())
self.selected_fields = options.pop("fields", None)
self.use_natural_foreign_keys = options.pop('use_natural_foreign_keys', False)
self.use_natural_primary_keys = options.pop('use_natural_primary_keys', False)
diff --git a/docs/releases/1.11.txt b/docs/releases/1.11.txt
index 1436ffe964..c94935f93a 100644
--- a/docs/releases/1.11.txt
+++ b/docs/releases/1.11.txt
@@ -192,7 +192,8 @@ Requests and Responses
Serialization
~~~~~~~~~~~~~
-* ...
+* The new ``django.core.serializers.base.Serializer.stream_class`` attribute
+ allows subclasses to customize the default stream.
Signals
~~~~~~~
diff --git a/tests/serializers/tests.py b/tests/serializers/tests.py
index 96284ca642..66f1d22398 100644
--- a/tests/serializers/tests.py
+++ b/tests/serializers/tests.py
@@ -353,6 +353,29 @@ class SerializersTestBase(object):
self.assertEqual(base_data, proxy_proxy_data.replace('proxy', ''))
+class SerializerAPITests(SimpleTestCase):
+
+ def test_stream_class(self):
+ class File(object):
+ def __init__(self):
+ self.lines = []
+
+ def write(self, line):
+ self.lines.append(line)
+
+ def getvalue(self):
+ return ''.join(self.lines)
+
+ class Serializer(serializers.json.Serializer):
+ stream_class = File
+
+ serializer = Serializer()
+ data = serializer.serialize([Score(id=1, score=3.4)])
+ self.assertIs(serializer.stream_class, File)
+ self.assertIsInstance(serializer.stream, File)
+ self.assertEqual(data, '[{"model": "serializers.score", "pk": 1, "fields": {"score": 3.4}}]')
+
+
class SerializersTransactionTestBase(object):
available_apps = ['serializers']