以下是我如何定义我的篮子,以及多个“项目”关系:
class Basket(Base):
__tablename__ = 'basket'
id = Column(Integer, primary_key=True)
items_id = Column(Integer, ForeignKey('item.id'))
items = relationship("Item", uselist=True)
class Item(Base):
__tablename__ = 'item'
id = Column(Integer, primary_key=True)
name = Column(String)
但是当我测试它时,对于某些存在,在会话提交之后,我的basket.items只保留一个项目。如果我再添加一些,然后再次提交,我的列表将保留一个。
我不明白为什么。这是我的测试:
>>> basket = Basket()
>>> s = session()
>>> s.add(basket)
>>> banana = Item(name="banana")
>>> orange = Item(name="orange")
>>> s.add(banana)
>>> s.add(orange)
>>> s.commit()
>>> basket.items.append(banana)
>>> basket.items.append(orange)
>>> basket.items
[<database.declarative.Item object at 0x10e4c7790>, <database.declarative.Item object at 0x10e4c7810>]
>>> s.commit()
>>> basket.items
[<database.declarative.Item object at 0x10e4c7810>]
答案 0 :(得分:1)
您的配置指定了从Basket
到Item
的多对一关系,因为它使用外键Basket.item_id
。您只能在该列上拥有一个ID,因此即使您指定Item
,您也只能在Basket.items
中拥有一个uselist=True
。
对此进行建模的正确方法是将外键放在Item
上:
class Basket(Base):
...
items = relationship("Item")
class Item(Base):
...
basket_id = Column(Integer, ForeignKey(Basket.id))
答案 1 :(得分:-1)
s.commit()可能正在释放整个会话。你想要刷新,然后最后提交。
s.flush()