Я думаю, вы описываете lazy="dynamic"
свойство relationship()
. что-то вроде
class Employee(Base):
__table_name__ = "employees"
...
projects = relationship(..., lazy="dynamic")
, что заставит Employee().project
вернуть экземпляр sqlalchemy.orm.Query
вместо коллекции, содержащей связанные элементы. Однако это означает, что нет (простого) способа прямого доступа к коллекции. Если вам это все еще нужно (скорее всего, вы действительно хотите, чтобы он загружался лениво, установите вместо него два relationship()
.
class Employee(Base):
__table_name__ = "employees"
...
projects_query = relationship(..., lazy="dynamic")
projects = relationship(..., lazy="select")
редактировать: вы сказали
Мне нужно каким-то образом получить объект динамического запроса уже привязанного свойства привязанного отношения.
Предположим, у нас есть экземпляр i
класса Foo
, связанный с классом Bar
свойством bars
. Во-первых, нам нужно получить свойство, которое обрабатывает отношения.
from sqlalchemy.orm.attributes import manager_of_class
p = manager_of_class(Foo).mapper.get_property('bars')
Нам нужно выражение, которое and_
объединяет все столбцы в i
, которые связывают его с bars
. Если вам нужно работать с Foo
через псевдоним, замените его здесь.
e = sqlalchemy.and_(*[getattr(Foo, c.key) == getattr(i, c.key)
for c in p.local_side])
Теперь мы можем создать запрос, который выражает эту связь. Подставьте псевдонимы для Foo
и Bar
здесь при необходимости.
q = session.query(Foo) \
.filter(e) \
.join(Foo.bars) \
.with_entities(Bar)