Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在保存时计算字段值?_Python_Sqlalchemy_Flask_Flask Sqlalchemy - Fatal编程技术网

Python 在保存时计算字段值?

Python 在保存时计算字段值?,python,sqlalchemy,flask,flask-sqlalchemy,Python,Sqlalchemy,Flask,Flask Sqlalchemy,我有一个模型,看起来像上面。我希望最后一个字母成为内容的最后一个字母。我应该将此逻辑放置在何处,以便在每次保存模型时都会发生此逻辑?我正在阅读有关混合属性的内容,但我不确定哪种方法是正确的。1.简单的方法:可以使用sqlalchemy列default值设置如下内容: class Quote(db.Model): id = db.Column(db.Integer, primary_key=True) content = db.Column(db.Text) vot

我有一个模型,看起来像上面。我希望
最后一个字母
成为
内容
的最后一个字母。我应该将此逻辑放置在何处,以便在每次保存模型时都会发生此逻辑?我正在阅读有关混合属性的内容,但我不确定哪种方法是正确的。

1.简单的方法:可以使用sqlalchemy列
default
值设置如下内容:

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))
没有检查这是否真的有效,我猜不会

2.您还可以执行类似于将此init添加到类的操作:

last_letter = db.Column(db.char, default=content[len(content)-1:])
  • 或者,您可以使用“listen”来处理“before insert”事件,并按照说明动态添加该事件

  • 您可以将sql计算列与sql触发器(在db中)一起使用,而不使用sqlalchemy

  • 您可能可以使用sqlalchemy映射器sql表达式作为混合属性,而且我自己也没有尝试过,这可能是最优雅的方法


  • 1.简单的方法:您可以使用sqlalchemy列
    default
    value设置如下内容:

    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))
    
    没有检查这是否真的有效,我猜不会

    2.您还可以执行类似于将此init添加到类的操作:

    last_letter = db.Column(db.char, default=content[len(content)-1:])
    
  • 或者,您可以使用“listen”来处理“before insert”事件,并按照说明动态添加该事件

  • 您可以将sql计算列与sql触发器(在db中)一起使用,而不使用sqlalchemy

  • 您可能可以使用sqlalchemy映射器sql表达式作为混合属性,而且我自己也没有尝试过,这可能是最优雅的方法


  • 最后一个字母可以用
    @property
    修饰并定义

    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
    

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

    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
    

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

    ,这不会将其保存在数据库中。。但是如果不需要数据库保存,这是一个很好的解决方案,它不会保存在数据库中。。但如果不需要节省数据库,这是一个很好的解决方案