aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlton Gibson2013-09-20 14:10:16 +0200
committerCarlton Gibson2013-09-20 14:10:46 +0200
commitf07a4f4ca3812fbe45d698e4ba0f9ff9099b6887 (patch)
tree15712abdf9cafe7cb6e6c3a8dddc25b2c83b5133
parenteb0a98ad4b031be5742b5d257b847404c2e5249b (diff)
downloaddjango-rest-framework-f07a4f4ca3812fbe45d698e4ba0f9ff9099b6887.tar.bz2
Clear cached serializer data on `save()` + test. Fixes #1116.
-rw-r--r--rest_framework/serializers.py3
-rw-r--r--rest_framework/tests/test_serializer.py16
2 files changed, 19 insertions, 0 deletions
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index a63c7f6c..8d2e0feb 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -518,6 +518,9 @@ class BaseSerializer(WritableField):
"""
Save the deserialized object and return it.
"""
+ # Clear cached _data, which may be invalidated by `save()`
+ self._data = None
+
if isinstance(self.object, list):
[self.save_object(item, **kwargs) for item in self.object]
diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py
index c2497660..43d24411 100644
--- a/rest_framework/tests/test_serializer.py
+++ b/rest_framework/tests/test_serializer.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.db.models.fields import BLANK_CHOICE_DASH
@@ -136,6 +137,7 @@ class BasicTests(TestCase):
'Happy new year!',
datetime.datetime(2012, 1, 1)
)
+ self.actionitem = ActionItem(title='Some to do item',)
self.data = {
'email': 'tom@example.com',
'content': 'Happy new year!',
@@ -264,6 +266,20 @@ class BasicTests(TestCase):
"""
self.assertRaises(AssertionError, PersonSerializerInvalidReadOnly, [])
+ def test_serializer_data_is_cleared_on_save(self):
+ """
+ Check _data attribute is cleared on `save()`
+
+ Regression test for #1116
+ — id field is not populated is `data` is accessed prior to `save()`
+ """
+ serializer = ActionItemSerializer(self.actionitem)
+ self.assertIsNone(serializer.data.get('id',None), 'New instance. `id` should not be set.')
+ serializer.save()
+ self.assertIsNotNone(serializer.data.get('id',None), 'Model is saved. `id` should be set.')
+
+
+
class DictStyleSerializer(serializers.Serializer):
"""