sqlalchemy получение данных из связанной таблицы

Есть такие модели:
class Registry(Base):
    __tablename__ = 'registry'
   
    id = Column(Integer, primary_key=True)
    status = Column(ForeignKey("status_registry.id"))

class StatusRegistry(Base):
    __tablename__ = 'status_registry'

    id = Column(Integer, primary_key=True)
    code = Column(Integer, nullable=False)

При попытке выполнить запрос и получить код статуса:

async with async_session_maker() as session:
    result = await session.execute(
        select(Registry)
        .filter_by(id=registry_id)
        .options(selectinload(Registry.status))
    )
    data = result.scalar_one()
    print(data.status.code) 

Получаю ошибку: Can't apply "select in loader" strategy to property "Registry.status", which is a "column property"; this loader strategy is intended to be used with a "relationship property".


Ответы (1 шт):

Автор решения: Рустам Рысаев

В вашей модели Registry поле status сейчас указывает на внешний ключ (ForeignKey), то есть это просто целочисленное поле, а не отношение (relationship). Чтобы корректно загружать связанные данные (например, status.code) через selectinload, нужно добавить relationship к модели.

Должно быть так:

class Registry(Base):
    __tablename__ = 'registry'

    id = Column(Integer, primary_key=True)
    status = Column(ForeignKey("status_registry.id"))

    # добавляем отношение
    status_obj = relationship("StatusRegistry", backref="registries")

Тогда ваш запрос нужно будет чуть поправить, т.к. теперь поле называется status_obj:

async with async_session_maker() as session:
    result = await session.execute(
        select(Registry)
        .filter_by(id=registry_id)
        .options(selectinload(Registry.status_obj))
    )
    data = result.scalar_one()
    print(data.status_obj.code)
→ Ссылка