У меня есть установка I, которая в экстремально простой форме выглядит следующим образом:
class Person(Model):
__tablename__ = 'persons'
id = Column(Integer, primary_key=True)
type = relationship("PersonType", back_populates="instances")
group = relationship("Group", back_populates="members")
type_id = Column(Integer, ForeignKey('person_types.id'))
group_id = Column(Integer, ForeignKey('group.id'))
class PersonType(Model):
__tablename__ = 'person_types'
id = Column(Integer, primary_key=True)
instances = relationship("Person", back_populates="type")
group = relationship("GroupType", back_populates="members")
group_id = Column(Integer, ForeignKey('group_types.id'))
class Group(Model):
__tablename__ = 'groups'
id = Column(Integer, primary_key=True)
type = relationship("PersonType", back_populates="instances")
members = relationship("Person", back_populates="group")
type_id = Column(Integer, ForeignKey('group_types.id'))
class GroupType(Model):
__tablename__ = 'group_types'
id = Column(Integer, primary_key=True)
instances = relationship("Group", back_populates="type")
members = relationship("PersonType", back_populates="group")
Когда мой веб-интерфейс запрашивает бэкэнд, он хочет получить вложенный объект, который использует многие из отношений. Например, когда я предоставляю объект Person, я одновременно использую Person.type.group и Person.group.type, который, очевидно, является одним и тем же объектом. Для меня важно, чтобы запросы были эффективными, поэтому при загрузке данных у меня появляется следующий запрос:
Person.query.options(selectinload('type'),
selectinload('type.group'),
selectinload('group'),
defaultload('group.type'),
raisedload('*'))
Но когда я получаю доступ к group.type
sqlalchemy.exc.InvalidRequestError: 'Group.type' is not available due to lazy='raise'
Но, как я прочитайте документацию group.type
должен быть загружен через type.group
таким образом, чтобы ему не нужно было go возвращаться в базу данных и спрашивать. Итак, правильно ли я понял это и могу ли я это проверить?