mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-02 19:40:13 +03:00
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:
parent
f92d8bd972
commit
86d25ece15
|
@ -125,6 +125,9 @@ class RelatedField(WritableField):
|
||||||
|
|
||||||
### Regular serializer stuff...
|
### 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):
|
def field_to_native(self, obj, field_name):
|
||||||
try:
|
try:
|
||||||
if self.source == '*':
|
if self.source == '*':
|
||||||
|
@ -145,11 +148,11 @@ class RelatedField(WritableField):
|
||||||
|
|
||||||
if self.many:
|
if self.many:
|
||||||
if is_simple_callable(getattr(value, 'all', 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())
|
||||||
else:
|
else:
|
||||||
# Also support non-queryset iterables.
|
# Also support non-queryset iterables.
|
||||||
# This allows us to also support plain lists of related items.
|
# 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)
|
return self.to_native(value)
|
||||||
|
|
||||||
def field_from_native(self, data, files, field_name, into):
|
def field_from_native(self, data, files, field_name, into):
|
||||||
|
|
|
@ -326,6 +326,9 @@ class BaseSerializer(WritableField):
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
def many_to_native(self, objects):
|
||||||
|
return [self.to_native(item) for item in objects]
|
||||||
|
|
||||||
def from_native(self, data, files):
|
def from_native(self, data, files):
|
||||||
"""
|
"""
|
||||||
Deserialize primitives -> objects.
|
Deserialize primitives -> objects.
|
||||||
|
@ -372,7 +375,7 @@ class BaseSerializer(WritableField):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if is_simple_callable(getattr(value, 'all', 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:
|
if value is None:
|
||||||
return None
|
return None
|
||||||
|
@ -383,7 +386,7 @@ class BaseSerializer(WritableField):
|
||||||
many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type))
|
many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type))
|
||||||
|
|
||||||
if many:
|
if many:
|
||||||
return [self.to_native(item) for item in value]
|
return self.many_to_native(value)
|
||||||
return self.to_native(value)
|
return self.to_native(value)
|
||||||
|
|
||||||
def field_from_native(self, data, files, field_name, into):
|
def field_from_native(self, data, files, field_name, into):
|
||||||
|
@ -527,7 +530,7 @@ class BaseSerializer(WritableField):
|
||||||
DeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
|
|
||||||
if many:
|
if many:
|
||||||
self._data = [self.to_native(item) for item in obj]
|
self._data = self.many_to_native(obj)
|
||||||
else:
|
else:
|
||||||
self._data = self.to_native(obj)
|
self._data = self.to_native(obj)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user