Как узнать, пока не загружено ленивое отношение, с SQLAlchemy?

С SQLAlchemy, есть ли способ заранее знать, будет ли отношение загружено lazy?
Например, учитывая ленивое отношение parent- > children и экземпляр X "parent", я хотел бы знать, загружен ли "X.children", не вызывая запрос.

Ответ 1

Я думаю, вы можете посмотреть на словарь атрибутов __dict__ для проверки наличия или отсутствия данных.

Ответ 2

Вы можете получить список всех выгруженных свойств (оба отношения и столбцы) из sqlalchemy.orm.attributes.instance_state(obj).unloaded.

Смотрите: Завершение объекта с его отношениями и исключение ненужных запросов в sqlalchemy

Более простой способ - использовать inspect(), который дает те же результаты:

from sqlalchemy import inspect
from sqlalchemy.orm import lazyload

user = session.query(User).options(lazyload(User.articles)).first()
ins = inspect(user)

ins.unloaded  # <- set or properties that are not yet loaded

Ответ 3

Чуть более аккуратный, чем Хейс (хотя он делает то же самое), должен использовать hasattr(), как в:

>>> hasattr(X, 'children')
False