我在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')
现在我想使用Item
和Record
。让我们创建一些对象:
i1 = Item(id='id1')
r = Record(id='mujrecord')
现在我想使用以下代码关联这些对象:
i1.records['source_wav'] = r
但是Record r
没有设置name
属性(外键)。有没有解决方案如何自动确保这一点? (我知道在Record
创建期间设置外键有效,但对我来说听起来不太好。)
非常感谢
答案 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'