Merge branch 'master' into basic-nested-serialization

This commit is contained in:
Tom Christie 2013-03-18 21:12:05 +00:00
commit ad3ffe20f0
3 changed files with 19 additions and 19 deletions

View File

@ -25,6 +25,7 @@ Let's start by creating a simple object we can use for example purposes:
comment = Comment(email='leila@example.com', content='foo bar') comment = Comment(email='leila@example.com', content='foo bar')
We'll declare a serializer that we can use to serialize and deserialize `Comment` objects. We'll declare a serializer that we can use to serialize and deserialize `Comment` objects.
Declaring a serializer looks very similar to declaring a form: Declaring a serializer looks very similar to declaring a form:
class CommentSerializer(serializers.Serializer): class CommentSerializer(serializers.Serializer):
@ -33,10 +34,17 @@ Declaring a serializer looks very similar to declaring a form:
created = serializers.DateTimeField() created = serializers.DateTimeField()
def restore_object(self, attrs, instance=None): def restore_object(self, attrs, instance=None):
"""
Given a dictionary of deserialized field values, either update
an existing model instance, or create a new model instance.
Note that if we don't define this method, then deserializing
data will simply return a dictionary of items.
"""
if instance is not None: if instance is not None:
instance.title = attrs['title'] instance.title = attrs.get('title', instance.title)
instance.content = attrs['content'] instance.content = attrs.get('content', instance.content)
instance.created = attrs['created'] instance.created = attrs.get('created', instance.created)
return instance return instance
return Comment(**attrs) return Comment(**attrs)
@ -91,9 +99,10 @@ To serialize a queryset instead of an object instance, you should pass the `many
## Validation ## 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. When deserializing data, you always need to call `is_valid()` before attempting to access the deserialized object. If any validation errors occur, the `.errors` property will contain a dictionary representing the resulting error messages.
Each key in the dictionary will be the field name, and the values will be lists of strings of any error messages corresponding to that field. The `non_field_errors` key may also be present, and will list any general validation errors.
When deserialising a list of items, errors will be returned as a list of tuples. The first item in an error tuple will be the index of the item with the error in the original data; The second item in the tuple will be a dict with the individual errors for that item. When deserializing a list of items, errors will be returned as a list of dictionaries representing each of the deserialized items.
### Field-level validation ### Field-level validation

View File

@ -126,7 +126,11 @@ The first thing we need to get started on our Web API is provide a way of serial
def restore_object(self, attrs, instance=None): def restore_object(self, attrs, instance=None):
""" """
Create or update a new snippet instance. Create or update a new snippet instance, given a dictionary
of deserialized field values.
Note that if we don't define this method, then deserializing
data will simply return a dictionary of items.
""" """
if instance: if instance:
# Update existing instance # Update existing instance

View File

@ -1,13 +0,0 @@
"""Tests for the status module"""
from __future__ import unicode_literals
from django.test import TestCase
from rest_framework import status
class TestStatus(TestCase):
"""Simple sanity test to check the status module"""
def test_status(self):
"""Ensure the status module is present and correct."""
self.assertEqual(200, status.HTTP_200_OK)
self.assertEqual(404, status.HTTP_404_NOT_FOUND)