diff --git a/djangorestframework/renderers.py b/djangorestframework/renderers.py index 7aa8777ce..56939bbce 100644 --- a/djangorestframework/renderers.py +++ b/djangorestframework/renderers.py @@ -108,6 +108,7 @@ class XMLRenderer(BaseRenderer): """ Renderer which serializes to XML. """ + media_type = 'application/xml' def render(self, obj=None, media_type=None): @@ -251,6 +252,7 @@ class DocumentingTemplateRenderer(BaseRenderer): The context used in the template contains all the information needed to self-document the response to this request. """ + content = self._get_content(self.view, self.view.request, obj, media_type) put_form_instance = self._get_form_instance(self.view, 'put') diff --git a/djangorestframework/serializer.py b/djangorestframework/serializer.py index 8d73d6236..da8036e94 100644 --- a/djangorestframework/serializer.py +++ b/djangorestframework/serializer.py @@ -4,7 +4,7 @@ Customizable serialization. from django.db import models from django.db.models.query import QuerySet from django.db.models.fields.related import RelatedField -from django.utils.encoding import smart_unicode +from django.utils.encoding import smart_unicode, is_protected_type import decimal import inspect @@ -273,13 +273,6 @@ class Serializer(object): return self.serialize_iter(obj.all()) - def serialize_decimal(self, obj): - """ - Convert a Decimal instance into a serializable representation. - """ - return str(obj) - - def serialize_fallback(self, obj): """ Convert any unhandled object into a serializable representation. @@ -301,9 +294,6 @@ class Serializer(object): elif isinstance(obj, models.Manager): # Manager objects return self.serialize_manager(obj) - elif isinstance(obj, decimal.Decimal): - # Decimals (force to string representation) - return self.serialize_decimal(obj) elif inspect.isfunction(obj) and not inspect.getargspec(obj)[0]: # function with no args return self.serialize_func(obj) @@ -311,5 +301,10 @@ class Serializer(object): # bound method return self.serialize_func(obj) - # fall back to smart unicode + # Protected types are passed through as is. + # (i.e. Primitives like None, numbers, dates, and Decimals.) + if is_protected_type(obj): + return obj + + # All other values are converted to string. return self.serialize_fallback(obj) diff --git a/djangorestframework/tests/serializer.py b/djangorestframework/tests/serializer.py index 783e941e8..9f6290502 100644 --- a/djangorestframework/tests/serializer.py +++ b/djangorestframework/tests/serializer.py @@ -18,7 +18,7 @@ class TestObjectToData(TestCase): def test_decimal(self): """Decimals need to be converted to a string representation.""" - self.assertEquals(self.serialize(decimal.Decimal('1.5')), '1.5') + self.assertEquals(self.serialize(decimal.Decimal('1.5')), decimal.Decimal('1.5')) def test_function(self): """Functions with no arguments should be called."""