aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2012-11-22 02:05:46 -0800
committerTom Christie2012-11-22 02:05:46 -0800
commitba553b7dcdb232079cb04e6d7cd673d39cc99695 (patch)
tree4ba4c0cceea3ca001665560619313aed1c9624b8
parentb0bad35ef0972ec26ff808d81b1f43f16683898d (diff)
parent0876bed96304c3c2125e0de67736d40bfe921cf7 (diff)
downloaddjango-rest-framework-ba553b7dcdb232079cb04e6d7cd673d39cc99695.tar.bz2
Merge pull request #438 from maspwr/partial-update
Add support for partial serializer updates
-rw-r--r--docs/api-guide/serializers.md4
-rw-r--r--rest_framework/fields.py2
-rw-r--r--rest_framework/serializers.py3
-rw-r--r--rest_framework/tests/serializer.py12
4 files changed, 20 insertions, 1 deletions
diff --git a/docs/api-guide/serializers.md b/docs/api-guide/serializers.md
index 048c1200..19efde3c 100644
--- a/docs/api-guide/serializers.md
+++ b/docs/api-guide/serializers.md
@@ -77,6 +77,10 @@ When deserializing data, we can either create a new instance, or update an exist
serializer = CommentSerializer(data=data) # Create new instance
serializer = CommentSerializer(comment, data=data) # Update `instance`
+By default, serializers must be passed values for all required fields or they will throw validation errors. You can use the `partial` argument in order to allow partial updates.
+
+ serializer = CommentSerializer(comment, data={'content': u'foo bar'}, partial=True) # Update `instance` with partial data
+
## Validation
When deserializing data, you always need to call `is_valid()` before attempting to access the deserialized object. If any validation errors occur, the `.errors` and `.non_field_errors` properties will contain the resulting error messages.
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index 25d98645..7b7b7148 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -54,6 +54,8 @@ class Field(object):
self.parent = parent
self.root = parent.root or parent
self.context = self.root.context
+ if self.root.partial:
+ self.required = False
def field_from_native(self, data, files, field_name, into):
"""
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 9f4964fa..53dcec16 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -91,12 +91,13 @@ class BaseSerializer(Field):
_options_class = SerializerOptions
_dict_class = SortedDictWithMetadata # Set to unsorted dict for backwards compatibility with unsorted implementations.
- def __init__(self, instance=None, data=None, files=None, context=None, **kwargs):
+ def __init__(self, instance=None, data=None, files=None, context=None, partial=False, **kwargs):
super(BaseSerializer, self).__init__(**kwargs)
self.opts = self._options_class(self.Meta)
self.fields = copy.deepcopy(self.base_fields)
self.parent = None
self.root = None
+ self.partial = partial
self.context = context or {}
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index 520029ec..61a05da1 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -115,6 +115,18 @@ class BasicTests(TestCase):
self.assertTrue(serializer.object is expected)
self.assertEquals(serializer.data['sub_comment'], 'And Merry Christmas!')
+ def test_partial_update(self):
+ msg = 'Merry New Year!'
+ partial_data = {'content': msg}
+ serializer = CommentSerializer(self.comment, data=partial_data)
+ self.assertEquals(serializer.is_valid(), False)
+ serializer = CommentSerializer(self.comment, data=partial_data, partial=True)
+ expected = self.comment
+ self.assertEqual(serializer.is_valid(), True)
+ self.assertEquals(serializer.object, expected)
+ self.assertTrue(serializer.object is expected)
+ self.assertEquals(serializer.data['content'], msg)
+
def test_model_fields_as_expected(self):
"""
Make sure that the fields returned are the same as defined