diff --git a/AUTHORS.rst b/AUTHORS.rst
index 1f8c8be..252f378 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -35,4 +35,4 @@ Contributors
 - Pierre Verkest `@petrus-v <https://github.com/petrus-v>`_
 - Erik Cederstrand `@ecederstrand <https://github.com/ecederstrand>`_
 - Daven Quinn `@davenquinn <https://github.com/davenquinn>`_
-- Peter Schutt `@5uper5hoot <https://github.com/5uper5hoot>`_
+- Peter Schutt `@peterschutt <https://github.com/peterschutt>`_
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index b4bac3b..3bb1106 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,14 @@
 Changelog
 ---------
 
+0.23.0 (unreleased)
++++++++++++++++++++
+
+Bug fixes:
+
+* Fix data keys when using ``Related`` with a ``Column`` that is named differently
+  from its attribute (:issue:`299`). Thanks :user:`peterschutt` for the catch and patch.
+
 0.22.3 (2020-03-01)
 +++++++++++++++++++
 
diff --git a/setup.py b/setup.py
index 781210f..22b74a5 100644
--- a/setup.py
+++ b/setup.py
@@ -4,9 +4,9 @@ from setuptools import setup, find_packages
 
 INSTALL_REQUIRES = ("marshmallow>=2.15.2", "SQLAlchemy>=1.2.0")
 EXTRAS_REQUIRE = {
-    "tests": ["pytest", "pytest-lazy-fixture", "mock"],
+    "tests": ["pytest", "pytest-lazy-fixture"],
     "lint": ["flake8==3.7.9", "flake8-bugbear==20.1.4", "pre-commit~=2.0"],
-    "docs": ["sphinx==2.4.4", "alabaster==0.7.12", "sphinx-issues==1.2.0"],
+    "docs": ["sphinx==3.0.2", "alabaster==0.7.12", "sphinx-issues==1.2.0"],
 }
 EXTRAS_REQUIRE["dev"] = EXTRAS_REQUIRE["tests"] + EXTRAS_REQUIRE["lint"] + ["tox"]
 
diff --git a/src/marshmallow_sqlalchemy/fields.py b/src/marshmallow_sqlalchemy/fields.py
index df13028..bc16a37 100644
--- a/src/marshmallow_sqlalchemy/fields.py
+++ b/src/marshmallow_sqlalchemy/fields.py
@@ -1,6 +1,7 @@
 from marshmallow import fields
 from marshmallow.utils import is_iterable_but_not_string
 
+from sqlalchemy import inspect
 from sqlalchemy.orm.exc import NoResultFound
 
 
@@ -58,9 +59,8 @@ class Related(fields.Field):
     @property
     def related_keys(self):
         if self.columns:
-            return [
-                self.related_model.__mapper__.columns[column] for column in self.columns
-            ]
+            insp = inspect(self.related_model)
+            return [insp.attrs[column] for column in self.columns]
         return get_primary_keys(self.related_model)
 
     @property
diff --git a/src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py b/src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py
index d397cd8..dad0923 100644
--- a/src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py
+++ b/src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py
@@ -1,4 +1,4 @@
-from marshmallow.fields import FieldABC
+from marshmallow.fields import Field
 from marshmallow.schema import Schema, SchemaMeta, SchemaOpts
 import sqlalchemy as sa
 from sqlalchemy.ext.declarative import DeclarativeMeta
@@ -10,8 +10,10 @@ from .load_instance_mixin import LoadInstanceMixin
 
 # This isn't really a field; it's a placeholder for the metaclass.
 # This should be considered private API.
-class SQLAlchemyAutoField(FieldABC):
+class SQLAlchemyAutoField(Field):
     def __init__(self, *, column_name=None, model=None, table=None, field_kwargs):
+        super().__init__()
+
         if model and table:
             raise ValueError("Cannot pass both `model` and `table` options.")
 

Ordering output doesn't work for auto_field
In marshmallow, to order serialization output, set ordered = True in the Meta class as follows.

```python
class MyModelSchema(SQLAlchemyAutoSchema):
    class Meta:
        model = MyModel
        ordered = True

    some_field = auto_field(validate=validate.Range(min=0, max=10))
```

It works well without ```auto_field```, but it generate following error with ```auto_field```.

```
AttributeError: 'SQLAlchemyAutoField' object has no attribute '_creation_index'
```

Is there any solution for this?
diff --git a/tests/test_sqlalchemy_schema.py b/tests/test_sqlalchemy_schema.py
index da4f827..c3b0003 100644
--- a/tests/test_sqlalchemy_schema.py
+++ b/tests/test_sqlalchemy_schema.py
@@ -6,6 +6,7 @@ import sqlalchemy as sa
 
 from marshmallow_sqlalchemy import SQLAlchemySchema, SQLAlchemyAutoSchema, auto_field
 from marshmallow_sqlalchemy.exceptions import IncorrectSchemaTypeError
+from marshmallow_sqlalchemy.fields import Related
 from .utils import unpack, MARSHMALLOW_VERSION_INFO
 
 
@@ -244,6 +245,21 @@ def test_auto_field_works_with_synonym(models):
     assert "curr_school_id" in schema.fields
 
 
+# Regresion test https://github.com/marshmallow-code/marshmallow-sqlalchemy/issues/306
+def test_auto_field_works_with_ordered_flag(models):
+    class StudentSchema(SQLAlchemyAutoSchema):
+        class Meta:
+            model = models.Student
+            ordered = True
+            strict = True  # marshmallow 2 compat
+
+        full_name = auto_field()
+
+    schema = StudentSchema()
+    # Declared fields precede auto-generated fields
+    assert tuple(schema.fields.keys()) == ("full_name", "id", "dob", "date_created")
+
+
 class TestAliasing:
     @pytest.fixture
     def aliased_schema(self, models):
@@ -359,3 +375,23 @@ class TestModelInstanceDeserialization:
         assert isinstance(load_data, models.Teacher)
         state = sa.inspect(load_data)
         assert state.transient
+
+
+def test_related_when_model_attribute_name_distinct_from_column_name(
+    models, session, teacher,
+):
+    class TeacherSchema(SQLAlchemyAutoSchema):
+        class Meta:
+            model = models.Teacher
+            load_instance = True
+            sqla_session = session
+            strict = True  # marshmallow 2 compat
+
+        current_school = Related(["id", "name"])
+
+    dump_data = unpack(TeacherSchema().dump(teacher))
+    assert "school_id" not in dump_data["current_school"]
+    assert dump_data["current_school"]["id"] == teacher.current_school.id
+    new_teacher = unpack(TeacherSchema().load(dump_data, transient=True))
+    assert new_teacher.current_school.id == teacher.current_school.id
+    assert unpack(TeacherSchema().load(dump_data)) is teacher

pip install -e .[dev]
parse_log_pytest
pytest
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
cachetools==5.5.2
certifi @ file:///croot/certifi_1671487769961/work/certifi
cfgv==3.3.1
chardet==5.2.0
colorama==0.4.6
distlib==0.3.9
entrypoints==0.3
filelock==3.12.2
flake8==3.7.9
flake8-bugbear==20.1.4
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
greenlet==3.1.1
identify==2.5.24
importlib-metadata==6.7.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
marshmallow==3.19.0
-e git+https://github.com/marshmallow-code/marshmallow-sqlalchemy.git@3d02bbb15d43e2e4c65039694faa8a73278c4006#egg=marshmallow_sqlalchemy
mccabe==0.6.1
mock==5.2.0
nodeenv==1.9.1
packaging==24.0
platformdirs==4.0.0
pluggy==1.2.0
pre-commit==2.21.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.5.0
pyflakes==2.1.1
pyproject-api==1.5.3
pytest==7.1.2
pytest-lazy-fixture==0.6.3
PyYAML==6.0.1
SQLAlchemy==2.0.40
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
tox==4.8.0
typing_extensions==4.7.1
virtualenv==20.26.6
zipp @ file:///croot/zipp_1672387121353/work

name: marshmallow-sqlalchemy
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==5.5.2
      - cfgv==3.3.1
      - chardet==5.2.0
      - colorama==0.4.6
      - distlib==0.3.9
      - entrypoints==0.3
      - filelock==3.12.2
      - flake8==3.7.9
      - flake8-bugbear==20.1.4
      - greenlet==3.1.1
      - identify==2.5.24
      - importlib-metadata==6.7.0
      - marshmallow==3.19.0
      - mccabe==0.6.1
      - mock==5.2.0
      - nodeenv==1.9.1
      - packaging==24.0
      - platformdirs==4.0.0
      - pluggy==1.2.0
      - pre-commit==2.21.0
      - pycodestyle==2.5.0
      - pyflakes==2.1.1
      - pyproject-api==1.5.3
      - pytest-lazy-fixture==0.6.3
      - pyyaml==6.0.1
      - sqlalchemy==2.0.40
      - tox==4.8.0
      - typing-extensions==4.7.1
      - virtualenv==20.26.6
prefix: /opt/conda/envs/marshmallow-sqlalchemy

tests/test_sqlalchemy_schema.py::test_related_when_model_attribute_name_distinct_from_column_name
tests/test_sqlalchemy_schema.py::test_auto_schema_skips_synonyms tests/test_sqlalchemy_schema.py::test_auto_field_works_with_synonym tests/test_sqlalchemy_schema.py::test_auto_field_works_with_ordered_flag
tests/test_sqlalchemy_schema.py::test_dump_with_relationships[sqla_schema_with_relationships] tests/test_sqlalchemy_schema.py::test_dump_with_relationships[sqla_auto_model_schema_with_relationships] tests/test_sqlalchemy_schema.py::test_dump_with_foreign_keys[sqla_schema_with_fks] tests/test_sqlalchemy_schema.py::test_dump_with_foreign_keys[sqla_auto_model_schema_with_fks] tests/test_sqlalchemy_schema.py::test_table_schema_dump tests/test_sqlalchemy_schema.py::test_load[sqla_schema_with_fks] tests/test_sqlalchemy_schema.py::test_load[sqla_auto_table_schema] tests/test_sqlalchemy_schema.py::test_load_validation_errors[sqla_schema_with_fks] tests/test_sqlalchemy_schema.py::test_load_validation_errors[sqla_auto_table_schema] tests/test_sqlalchemy_schema.py::test_auto_field_on_plain_schema_raises_error tests/test_sqlalchemy_schema.py::test_cannot_set_both_model_and_table tests/test_sqlalchemy_schema.py::test_passing_model_to_auto_field tests/test_sqlalchemy_schema.py::test_passing_table_to_auto_field tests/test_sqlalchemy_schema.py::TestAliasing::test_passing_column_name[aliased_schema] tests/test_sqlalchemy_schema.py::TestAliasing::test_passing_column_name_and_attribute tests/test_sqlalchemy_schema.py::TestModelInstanceDeserialization::test_load[sqla_schema_class] tests/test_sqlalchemy_schema.py::TestModelInstanceDeserialization::test_load[sqla_auto_schema_class] tests/test_sqlalchemy_schema.py::TestModelInstanceDeserialization::test_load_transient
setup.py src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py AUTHORS.rst CHANGELOG.rst src/marshmallow_sqlalchemy/fields.py
setup.py src/marshmallow_sqlalchemy/schema/sqlalchemy_schema.py AUTHORS.rst CHANGELOG.rst src/marshmallow_sqlalchemy/fields.py