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)