SQLAlchemy - MappedCollection问题

时间:2009-04-27 14:46:10

标签: python sqlalchemy

我在Python的SQLAlchemy中设置字典集时遇到了一些问题:

我正在使用表的声明性定义。我有Item表与Record表的1:N关系。我使用以下代码设置关系:

_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')

现在我想使用ItemRecord。让我们创建一些对象:

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

现在我想使用以下代码关联这些对象:

i1.records['source_wav'] = r

但是Record r没有设置name属性(外键)。有没有解决方案如何自动确保这一点? (我知道在Record创建期间设置外键有效,但对我来说听起来不太好。)

非常感谢

3 个答案:

答案 0 :(得分: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 :(得分:1)

我还不能发表评论,所以我只想把它写成一个单独的答案:

from sqlalchemy.orm import validates

class Item(_Base):
    [...]

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

这基本上是Gunnlaugur答案的副本,但滥用验证装饰器来做一些比爆炸更有用的东西。

答案 2 :(得分:0)

你有:

backref='item'

这是

的错字吗?
backref='name'