保存时计算字段值?

时间:2013-02-03 23:12:06

标签: python sqlalchemy flask flask-sqlalchemy

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的最后一个字母。我应该在哪里放置这个逻辑,以便每次保存模型时都会出现这种情况?我正在阅读混合属性和东西,我不确定哪种方式是正确的。

2 个答案:

答案 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
  1. 或者您可以使用“监听”“插入前”事件,并按照here解释动态添加。

  2. 你可以使用带有sql触发器的sql计算列(在db中)而不使用sqlalchemy。

  3. 你可以使用sqlalchemy mapper sql表达式作为混合属性,我自己也没有尝试过,看看simple enough并且可能是最优雅的方法。

答案 1 :(得分:0)

last_letter可以使用@property进行修饰并定义

@property
def last_letter(self):
    return self.content[-1]

免责声明:我刚学会了如何使用装饰器并在各处使用它们