【问题标题】:Computing field values on save?保存时计算字段值?
【发布时间】:2013-02-04 07:53:14
【问题描述】:
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 的最后一个字母。我应该把这个逻辑放在哪里,以便每次保存模型时都会发生?我正在阅读有关混合属性之类的内容,但我不确定哪种方式是正确的。

【问题讨论】:

    标签: python sqlalchemy flask flask-sqlalchemy


    【解决方案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. 或者您可以使用“listen”到“before insert”事件并按照here 的说明动态添加。

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

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

      李>

    【讨论】:

      【解决方案2】:

      last_letter 可以用@property 装饰并定义

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

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

      【讨论】:

      • 不会将其保存在数据库中。但如果不需要保存数据库,这是一个很好的解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多