aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rest_framework/fields.py3
-rw-r--r--rest_framework/serializers.py2
-rw-r--r--rest_framework/tests/test_serializer.py3
-rw-r--r--rest_framework/tests/test_serializer_empty.py15
4 files changed, 21 insertions, 2 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 16344d01..6b039f6c 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -777,6 +777,7 @@ class IntegerField(WritableField):
type_name = 'IntegerField'
type_label = 'integer'
form_field_class = forms.IntegerField
+ empty = 0
default_error_messages = {
'invalid': _('Enter a whole number.'),
@@ -808,6 +809,7 @@ class FloatField(WritableField):
type_name = 'FloatField'
type_label = 'float'
form_field_class = forms.FloatField
+ empty = 0
default_error_messages = {
'invalid': _("'%s' value must be a float."),
@@ -828,6 +830,7 @@ class DecimalField(WritableField):
type_name = 'DecimalField'
type_label = 'decimal'
form_field_class = forms.DecimalField
+ empty = Decimal('0')
default_error_messages = {
'invalid': _('Enter a number.'),
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index bc9f73d1..8e945688 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -310,6 +310,8 @@ class BaseSerializer(WritableField):
ret.fields = self._dict_class()
for field_name, field in self.fields.items():
+ if field.read_only and obj is None:
+ continue
field.initialize(parent=self, field_name=field_name)
key = self.get_field_key(field_name)
value = field.field_to_native(obj, field_name)
diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py
index 8d246b01..d4e5a93f 100644
--- a/rest_framework/tests/test_serializer.py
+++ b/rest_framework/tests/test_serializer.py
@@ -159,8 +159,7 @@ class BasicTests(TestCase):
expected = {
'email': '',
'content': '',
- 'created': None,
- 'sub_comment': ''
+ 'created': None
}
self.assertEqual(serializer.data, expected)
diff --git a/rest_framework/tests/test_serializer_empty.py b/rest_framework/tests/test_serializer_empty.py
new file mode 100644
index 00000000..30cff361
--- /dev/null
+++ b/rest_framework/tests/test_serializer_empty.py
@@ -0,0 +1,15 @@
+from django.test import TestCase
+from rest_framework import serializers
+
+
+class EmptySerializerTestCase(TestCase):
+ def test_empty_serializer(self):
+ class FooBarSerializer(serializers.Serializer):
+ foo = serializers.IntegerField()
+ bar = serializers.SerializerMethodField('get_bar')
+
+ def get_bar(self, obj):
+ return 'bar'
+
+ serializer = FooBarSerializer()
+ self.assertEquals(serializer.data, {'foo': 0})