假设我们UserModel
有以下列:
class UserModel(declarative_base(bind=engine)):
__tablename__ = "users"
id = Column(Integer, autoincrement=True, primary_key=True)
nickname = Column(String, unique=True, nullable=False)
有没有办法将id
设置为nickname
的默认值而不更改模型类之外的任何内容?
我尝试使用default=id
和server_default=id
,但始终在commit
上引发IntegrityError。
另外,我知道在执行id
或commit
之前没有flush
,但在我之外调用flush不是一个选项。
感谢。
答案 0 :(得分:0)
您应该使用hybrid_property。这里的例子:
class UserModel(Base):
__tablename__ = "users"
id = Column(Integer, autoincrement=True, primary_key=True)
nickname_str = Column(String, unique=True)
@hybrid_property
def nickname(self):
return self.nickname_str or str(self.id)
@nickname.expression
def nickname(self):
return case(
[(self.nickname_str != None, self.nickname_str)],
else_=cast(self.id, String)
).label('nickname')
@nickname.setter
def nickname(self, value):
self.nickname_str = value
完整示例here。