Add many_to_native method

Allows serializers to be easily customized when many=True rather than
always returning a list of objects.
This commit is contained in:
Chris Conley 2013-10-23 14:26:22 -04:00
parent f92d8bd972
commit 86d25ece15
2 changed files with 11 additions and 5 deletions

View File

@ -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):

View File

@ -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)