2016-03-29 31 views
0

下面是我定義我的籃子,有很多「項目」的關係:SQLAlchemy的,一對多的名單一直下降到一個對象後提交

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>] 

回答

1

您的配置指定從BasketItem一個多到一的關係,因爲它使用外鍵Basket.item_id。您只能在該列上擁有一個ID,因此即使您指定uselist=True,您也只能在Basket.items中擁有一個Item

模型的正確方法是將外鍵Item代替:

class Basket(Base): 
    ... 
    items   = relationship("Item") 

class Item(Base): 
    ... 
    basket_id = Column(Integer, ForeignKey(Basket.id)) 
+0

是的,它的工作原理。現在你說了,似乎很明顯。我的錯誤是認爲控制層在工作方面是工作的,並且決不允許一次將多個項目添加到項目列表中,如發生該情況時拋出異常。所以當提交完成時,會執行更改和更正。感謝您的幫助 ! –

-1

s.commit()可能會釋放整個會話。你會想要刷新,然後最後提交。

s.flush() 
相關問題