class Quote(db.Model):
id = db.Column(db.Integer, primary_key=True)
content = db.Column(db.Text)
votes = db.Column(db.Integer)
author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
date_added = db.Column(db.DateTime,default=datetime.datetime.now())
last_letter = db.Column(db.String(1))
我有一个看起来像上面的模型。我希望last_letter
成为content
的最后一个字母。我应该在哪里放置这个逻辑,以便每次保存模型时都会出现这种情况?我正在阅读混合属性和东西,我不确定哪种方式是正确的。
答案 0 :(得分:1)
1.朴素的方式:您可以使用sqlalchemy列default
值来设置如下内容:
last_letter = db.Column(db.char, default=content[len(content)-1:])
没有检查这是否真的有效,猜不是。
2.你也可以做一些事情,比如在课堂上添加 init :
def __init__(self,id,content,votes,auther_id,date_added):
self.id = id
self.content = content
#yadda yadda etc
self.last_letter = content[len(content)-1:] #or something similiar
或者您可以使用“监听”“插入前”事件,并按照here解释动态添加。
你可以使用带有sql触发器的sql计算列(在db中)而不使用sqlalchemy。
你可以使用sqlalchemy mapper sql表达式作为混合属性,我自己也没有尝试过,看看simple enough并且可能是最优雅的方法。
答案 1 :(得分:0)
last_letter
可以使用@property
进行修饰并定义
@property
def last_letter(self):
return self.content[-1]
免责声明:我刚学会了如何使用装饰器并在各处使用它们