2013-02-03 30 views
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_lettercontent的最后一个字母。我应该在哪里放置这种逻辑,以便每次保存模型时都会发生这种情况?我正在阅读有关Hybrid Properties和东西,我不确定哪种方式是正确的。保存时计算字段值?

回答

1

1.简单的方式:你可以使用SQLAlchemy列default值设置是这样的:

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

没有检查,如果这样做实际的工作,想不会。

2.you也可以这样做增加这个初始化到类:

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的说明动态添加。

  • 你可以在没有sqlalchemy的情况下使用带有sql触发器(在db中)的sql计算列。

  • 你也许可以使用SQLAlchemy的映射SQL表达式作为混合的财产,也没尝试自己,看看simple enough而且可能是最优雅的方式来做到这一点。

  • 0

    last_letter可以用@property装饰和定义

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

    声明:我只是学会了如何使用装饰和正在使用他们无处不在

    +0

    ,不会将其保存在数据库..但如果不需要数据库保存,这是一个很好的解决方案 – alonisser