def field_to_native(self, obj, field_name): """ Override default so that the serializer can be used as a nested field across relationships. """ from rest_framework.serializers import ObjectDoesNotExist, get_component, is_simple_callable if self.source == '*': return self.to_native(obj) try: source = self.source or field_name value = obj for component in source.split('.'): value = get_component(value, component) if value is None: break except ObjectDoesNotExist: return None if is_simple_callable(getattr(value, 'all', None)): return self.many_to_native(value.all()) if value is None: return None if self.many is not None: many = self.many else: many = hasattr(value, '__iter__') and not isinstance(value, (Page, dict, six.text_type)) if many: return self.many_to_native(value) return self.to_native(value)
def to_native(self, obj): """ Serialize objects -> primitives. """ if is_simple_callable(getattr(obj, 'all', None)): ret = [super(RemoteFieldsModelSerializerMixin, self).to_native(i) for i in obj.all()] else: ret = super(RemoteFieldsModelSerializerMixin, self).to_native(obj) for field_name, field in self.get_remote_serializers(): obj_field = getattr(obj, field_name, None) ret[field_name] = field.__class__(obj_field).data return ret