1
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是什么的最后一个字母。我应该把这个逻辑放在哪里,以便每次保存模型时都会发生?我正在阅读有关混合属性和其他内容的信息,但我不确定哪种方式是正确的。

4

2 回答 2

1

1.朴素的方式:您可以使用sqlalchemy列default值设置如下:

last_letter = db.Column(db.char, default=content[len(content)-1:])

没有检查这是否真的有效,猜不到。

2.您还可以执行以下操作,例如将此初始化添加到类中:

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. 或者您可以使用“听”到“插入前”事件并按照此处的说明动态添加它。

  2. 您可以在没有 sqlalchemy 的情况下使用带有 sql 触发器(在数据库中)的 sql 计算列。

  3. 您可能可以使用 sqlalchemy mapper sql 表达式作为混合属性,我自己也没有尝试过,看起来很简单,可能是最优雅的方法。

于 2013-02-03T23:46:27.933 回答
0

last_letter可以装饰@property和定义

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

免责声明:我刚刚学会了如何使用装饰器并且在任何地方都在使用它们

于 2013-02-03T23:53:14.423 回答