2009-04-27 12 views
3

私は、PythonのSQLAlchemyの辞書のコレクションを設定するといくつかの問題を抱えています。私はテーブルと1:N関係のItemテーブルを持っています。SQLAlchemyのMappedCollection問題

_Base = declarative_base() 

class Record(_Base): 
    __tablename__ = 'records' 

    item_id = Column(String(M_ITEM_ID), ForeignKey('items.id')) 
    id = Column(String(M_RECORD_ID), primary_key=True) 
    uri = Column(String(M_RECORD_URI)) 
    name = Column(String(M_RECORD_NAME)) 

class Item(_Base): 
    __tablename__ = 'items' 

    id = Column(String(M_ITEM_ID), primary_key=True) 

    records = relation(Record, collection_class=column_mapped_collection(Record.name), backref='item') 

は、今私はItem sおよびRecord秒で仕事をしたい:私は、次のコードを使用して関係を設定します。

i1 = Item(id='id1') 
r = Record(id='mujrecord') 

をそして今、私は次のコードを使用して、これらのオブジェクトを関連付ける::いくつかのオブジェクトを作成してみましょう

i1.records['source_wav'] = r 

しかしRecord rname属性(外部キー)を設定していません。自動的にこれを保証する方法はありますか? (私は、Recordの作成作業中に外部キーを設定することは知っていますが、それは私にとっては良いとは言えません)。あなたが持っている

感謝

答えて

0

backref='item' 

これは

backref='name' 

ための誤植ですか?

+1

おそらくそうではありません。 backrefは、sqlalchemyが関係の他の側(Recordクラス)に追加する属性の名前で、前方参照を保持するオブジェクト(Itemインスタンス)を参照します。ですから、 'item'は意味があります - honzasの例では、r.itemはItemインスタンスを生成します。 –

2

あなたはこのような何か欲しい:希望の検証を取得し、これにより

from sqlalchemy.orm import validates 

class Item(_Base): 
    [...] 

    @validates('records') 
    def validate_record(self, key, record): 
     assert record.name is not None, "Record fails validation, must have a name" 
     return record 

を:

>>> i1 = Item(id='id1') 
>>> r = Record(id='mujrecord') 
>>> i1.records['source_wav'] = r 
Traceback (most recent call last): 
    [...] 
AssertionError: Record fails validation, must have a name 
>>> r.name = 'foo' 
>>> i1.records['source_wav'] = r 
>>> 
1

私はまだコメントすることはできませんので、私はちょうどとしてこれを書くつもりです別の答え:

from sqlalchemy.orm import validates 

class Item(_Base): 
    [...] 

    @validates('records') 
    def validate_record(self, key, record): 
     record.name=key 
     return record 

これは基本的にGunnlaugurの答えのコピーですが、バリデーションのデコレータを濫用します爆発よりも有用な何か。

関連する問題