2009-04-27 28 views
3

我有一些問題在Python的SQLAlchemy的設立字典集合:SQLAlchemy的 - MappedCollection問題

我使用表的聲明性定義。我有Item表與1:N關係表Record表。我建立的關係用下面的代碼:

_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 s到工作。讓我們來創建一些對象:

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

,現在我想對這些對象的使用下面的代碼相關聯:

i1.records['source_wav'] = r 

Record r沒有固定的name屬性(外鍵)。有沒有解決方案如何自動確保這一點? (我知道在Record創作過程中設置外鍵,但對我來說聽起來不太好)。

非常感謝

回答

0

您有:

backref='item' 

這是對

backref='name' 

一個錯字?

+1

可能不是。 backref是sqlalchemy將添加到關係的另一端(Record類)的屬性的名稱,以引用返回包含前向引用的對象(Item實例)。所以'item'是有道理的 - 在honzas的例子中,r.item產生Item實例。 – 2009-05-19 20:03:52

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的答案的副本,但濫用驗證裝飾器做比爆炸更有用的東西。