我有2个表,“tems”和“item_sets”。 “items”表中的项目可以单独存在,或者一个项目可以是1个或多个项目的子项目。 “item_sets”用于映射这些孩子的父母。模型目前定义为:
class Item_sets(Base):
__tablename__ = 'item_sets'
id_item_old = Column(BIGINT(unsigned=True), ForeignKey('items.id'), primary_key=True)
id_item_new = Column(BIGINT(unsigned=True), ForeignKey('items.id'), primary_key=True)
class Item(Base):
__tablename__ = 'items'
#with_variant() allows sqlalchemy to auto assign the id's, since bigint is foreign to it
id = Column(BIGINT(unsigned=True).with_variant(Integer, "sqlite"), primary_key=True)
name = Column(String)
old_items = relationship(Item_sets, secondary='old_items', primaryjoin=id==Item_sets.id_item_new, lazy='joined')
通过关系,我已经映射了项目,以便它可以找到它拥有的所有父项。例如,当我这样做时:
items = DBSession.query(Item).filter(Item.id == 10).first()
for item in items.old_items:
print (item.id_item_old, item.id_item_new)
>>> (1,10)
>>> (2,10)
>>> (3,10)
但现在我不知道如何更改该代码,因此print将从Item表中打印父项,而不是从Item_sets表中打印id。我想在Item表中使用关系来做到这一点。
答案 0 :(得分:1)
这是从Item
到Item
到item_sets
的自引用多对多关系,而不是Item
到Item_sets
之间的多对多关系{1}}到old_items
(?)。
old_items = relationship(lambda: Item, secondary=Item_sets.__table__,
primaryjoin=id==Item_sets.id_item_new,
secondaryjoin=Item_sets.id_item_old == id)
附注:您的id_item_old
和id_item_new
外键应指向'items.id'
,而不是'item.id'
。