多对一自我引用SQLAclhemy表,并返回表内容

时间:2016-03-21 12:20:48

标签: python sqlalchemy relationship

我有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表中使用关系来做到这一点。

1 个答案:

答案 0 :(得分:1)

这是从ItemItemitem_sets的自引用多对多关系,而不是ItemItem_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_oldid_item_new外键应指向'items.id',而不是'item.id'