From 86d25ece15cf4ca8628d6c25a1bb201ac2789893 Mon Sep 17 00:00:00 2001 From: Chris Conley Date: Wed, 23 Oct 2013 14:26:22 -0400 Subject: [PATCH] Add many_to_native method Allows serializers to be easily customized when many=True rather than always returning a list of objects. --- rest_framework/relations.py | 7 +++++-- rest_framework/serializers.py | 9 ++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index 35c00bf1d..b78694ce3 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -125,6 +125,9 @@ class RelatedField(WritableField): ### Regular serializer stuff... + def many_to_native(self, objects): + return [self.to_native(item) for item in objects] + def field_to_native(self, obj, field_name): try: if self.source == '*': @@ -145,11 +148,11 @@ class RelatedField(WritableField): if self.many: if is_simple_callable(getattr(value, 'all', None)): - return [self.to_native(item) for item in value.all()] + return self.many_to_native(value.all()) else: # Also support non-queryset iterables. # This allows us to also support plain lists of related items. - return [self.to_native(item) for item in value] + return self.many_to_native(value) return self.to_native(value) def field_from_native(self, data, files, field_name, into): diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 4210d058b..661f45c35 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -326,6 +326,9 @@ class BaseSerializer(WritableField): return ret + def many_to_native(self, objects): + return [self.to_native(item) for item in objects] + def from_native(self, data, files): """ Deserialize primitives -> objects. @@ -372,7 +375,7 @@ class BaseSerializer(WritableField): return None if is_simple_callable(getattr(value, 'all', None)): - return [self.to_native(item) for item in value.all()] + return self.many_to_native(value.all()) if value is None: return None @@ -383,7 +386,7 @@ class BaseSerializer(WritableField): many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type)) if many: - return [self.to_native(item) for item in value] + return self.many_to_native(value) return self.to_native(value) def field_from_native(self, data, files, field_name, into): @@ -527,7 +530,7 @@ class BaseSerializer(WritableField): DeprecationWarning, stacklevel=2) if many: - self._data = [self.to_native(item) for item in obj] + self._data = self.many_to_native(obj) else: self._data = self.to_native(obj)