【发布时间】:2019-04-27 02:29:19
【问题描述】:
我正在为 sqlite 数据库设置 Sqlalchemy 映射器。我的 User 类与我的 Team 类具有不可为空的关系。我已有的代码如下:
class Team(Base):
__tablename__ = 'teams'
team_id = Column(Integer, primary_key=True)
# Using Integer as holder for boolean
is_local = Column(Integer, default=0)
class User(Base):
__tablename__ = 'users'
user_id = Column(Integer, primary_key=True)
team_id = Column(Integer, ForeignKey(Team.team_id), default=1, nullable=False)
team = relationship('Team')
is_local = Column(Integer, default=0)
我想确定User.is_local 的值默认为用户链接团队的Team.is_local 值。
但是,在创建用户之后,我仍然希望能够修改用户的 is_local 值,而无需更改团队或团队中任何其他用户的值。
所以如果我要执行
faraway = Team(is_local=1)
session.add(faraway)
session.commit()
u = User(team=faraway)
session.add(u)
session.commit()
print(bool(u.is_local))
结果应该是True
到目前为止,我已经按照https://stackoverflow.com/a/36579924 的建议尝试了上下文相关的默认函数,但我还没有找到允许我引用Team.is_local 的语法
有没有简单的方法来做到这一点?
【问题讨论】:
-
也许您可以尝试使用 sql 表达式作为默认值,以便在插入时从
team表中选择值,请参阅:docs.sqlalchemy.org/en/13/core/…;或者也许使用事件侦听器来挂钩诸如before_flush之类的事件,以便在实例进入数据库的过程中将状态添加到实例中。请参阅:docs.sqlalchemy.org/en/13/orm/…。很抱歉,因为我在打电话,所以没有写正式的答案,但我想我会分享一些可能有助于让你感动的想法。 -
@SuperShoot 第一个建议似乎有效。我被示例中的拼写错误(单个
=而不是==)难住了
标签: python sqlalchemy