ここ

2016-03-29 4 views
0

をコミットするには、私は多くの「アイテムの関係にして、マイバスケットを定義した方法です後SQLAlchemyの、多くのリストへの1つは、常に1つのオブジェクトにドロップします。いくつかのために、ここ

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) 

しかし、私はそれをテストraison、セッションコミット後、私のbasket.itemsは1つのアイテムしか保持しません。もう少し追加してからもう一度コミットすれば、私のリストは1つにとどまります。

なぜか分かりません。ここに私のテストがあります:

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

それが外部キーBasket.item_idを使用しているため、実際の構成は、ItemBasketから多対1の関係を指定します。その列にIDを1つだけ設定できるので、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()