3

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

我正在使用表的声明性定义。我的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')

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

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

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

i1.records['source_wav'] = r

Record r没有设置name属性(外键)。有什么解决方案如何自动确保这一点?(我知道在Record创建过程中设置外键是可行的,但这对我来说并不好)。

非常感谢

4

3 回答 3

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
>>> 
于 2009-05-19T19:58:56.657 回答
1

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

从 sqlalchemy.orm 导入验证

类项目(_Base):
    [...]

    @validates('记录')
    def validate_record(self, key, record):
      记录名称=键
      退货记录

这基本上是 Gunnlaugur 答案的副本,但滥用 validates 装饰器来做一些比爆炸更有用的事情。

于 2009-05-20T20:15:07.963 回答
0

你有:

backref='item'

这是一个错字吗

backref='name'

?

于 2009-05-07T20:29:12.463 回答