This commit is contained in:
Tom Christie 2013-10-10 17:34:15 +01:00
commit f18158358d
6 changed files with 58 additions and 3 deletions

View File

@ -67,6 +67,21 @@ At this point we've translated the model instance into Python native datatypes.
json json
# '{"email": "leila@example.com", "content": "foo bar", "created": "2012-08-22T16:20:09.822"}' # '{"email": "leila@example.com", "content": "foo bar", "created": "2012-08-22T16:20:09.822"}'
### Customizing field representation
Sometimes when serializing objects, you may not want to represent everything exactly the way it is in your model.
If you need to customize the serialized value of a particular field, you can do this by creating a `transform_<fieldname>` method. For example if you needed to render some markdown from a text field:
description = serializers.TextField()
description_html = serializers.TextField(source='description', read_only=True)
def transform_description_html(self, obj, value):
from django.contrib.markup.templatetags.markup import markdown
return markdown(value)
These methods are essentially the reverse of `validate_<fieldname>` (see *Validation* below.)
## Deserializing objects ## Deserializing objects
Deserialization is similar. First we parse a stream into Python native datatypes... Deserialization is similar. First we parse a stream into Python native datatypes...

View File

@ -170,6 +170,7 @@ The following people have helped make REST framework great.
* Ben Reilly - [bwreilly] * Ben Reilly - [bwreilly]
* Tai Lee - [mrmachine] * Tai Lee - [mrmachine]
* Markus Kaiserswerth - [mkai] * Markus Kaiserswerth - [mkai]
* Henry Clifford - [hcliff]
Many thanks to everyone who's contributed to the project. Many thanks to everyone who's contributed to the project.
@ -376,3 +377,4 @@ You can also contact [@_tomchristie][twitter] directly on twitter.
[bwreilly]: https://github.com/bwreilly [bwreilly]: https://github.com/bwreilly
[mrmachine]: https://github.com/mrmachine [mrmachine]: https://github.com/mrmachine
[mkai]: https://github.com/mkai [mkai]: https://github.com/mkai
[hcliff]: https://github.com/hcliff

View File

@ -225,7 +225,7 @@ For the moment we won't use any of REST framework's other features, we'll just w
We'll start off by creating a subclass of HttpResponse that we can use to render any data we return into `json`. We'll start off by creating a subclass of HttpResponse that we can use to render any data we return into `json`.
Edit the `snippet/views.py` file, and add the following. Edit the `snippets/views.py` file, and add the following.
from django.http import HttpResponse from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt

View File

@ -25,13 +25,13 @@ def strict_positive_int(integer_string, cutoff=None):
ret = min(ret, cutoff) ret = min(ret, cutoff)
return ret return ret
def get_object_or_404(queryset, **filter_kwargs): def get_object_or_404(queryset, *filter_args, **filter_kwargs):
""" """
Same as Django's standard shortcut, but make sure to raise 404 Same as Django's standard shortcut, but make sure to raise 404
if the filter_kwargs don't match the required types. if the filter_kwargs don't match the required types.
""" """
try: try:
return _get_object_or_404(queryset, **filter_kwargs) return _get_object_or_404(queryset, *filter_args, **filter_kwargs)
except (TypeError, ValueError): except (TypeError, ValueError):
raise Http404 raise Http404

View File

@ -315,6 +315,9 @@ class BaseSerializer(WritableField):
field.initialize(parent=self, field_name=field_name) field.initialize(parent=self, field_name=field_name)
key = self.get_field_key(field_name) key = self.get_field_key(field_name)
value = field.field_to_native(obj, field_name) value = field.field_to_native(obj, field_name)
method = getattr(self, 'transform_%s' % field_name, None)
if callable(method):
value = method(obj, value)
ret[key] = value ret[key] = value
ret.fields[key] = self.augment_field(field, field_name, key, value) ret.fields[key] = self.augment_field(field, field_name, key, value)

View File

@ -1658,3 +1658,38 @@ class SerializerSupportsManyRelationships(TestCase):
serializer = SimpleSlugSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]}) serializer = SimpleSlugSourceModelSerializer(data={'text': 'foo', 'targets': [1, 2]})
self.assertTrue(serializer.is_valid()) self.assertTrue(serializer.is_valid())
self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]}) self.assertEqual(serializer.data, {'text': 'foo', 'targets': [1, 2]})
class TransformMethodsSerializer(serializers.Serializer):
a = serializers.CharField()
b_renamed = serializers.CharField(source='b')
def transform_a(self, obj, value):
return value.lower()
def transform_b_renamed(self, obj, value):
if value is not None:
return 'and ' + value
class TestSerializerTransformMethods(TestCase):
def setUp(self):
self.s = TransformMethodsSerializer()
def test_transform_methods(self):
self.assertEqual(
self.s.to_native({'a': 'GREEN EGGS', 'b': 'HAM'}),
{
'a': 'green eggs',
'b_renamed': 'and HAM',
}
)
def test_missing_fields(self):
self.assertEqual(
self.s.to_native({'a': 'GREEN EGGS'}),
{
'a': 'green eggs',
'b_renamed': None,
}
)