如何根据同一模型的其他两列设置sqlalchemy中一列的值?

Geo*_*lis 3 python sqlalchemy flask-sqlalchemy

我正在构建一个 Web 应用程序。我有以下型号。

class Staff(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'))
    first_name = db.Column(db.String(64))
    last_name = db.Column(db.String(64))
    username = db.Column(db.String(64))
    cell_phone = db.Column(db.Integer)
    email = db.Column(db.String(64))
    position = db.Column(db.String(64))
    # add average salary value based on payroll
Run Code Online (Sandbox Code Playgroud)

我想要的usernamefirst_name+last_name与用户键入在形式他的姓和名。

我知道如何使用@db.event.listens_for(Staff, "after_insert")等并像这样更新它。但是有没有办法在模型中定义一些东西,让它在没有触发器的情况下自动完成?`

kra*_*ski 7

你应该熟悉property装饰器。

对于 SQLAlchemy hybrid_property,我强烈建议您学习和使用它的扩展。看一个例子:

from sqlalchemy.ext.hybrid import hybrid_property

class Staff(db.Model):
    first_name = db.Column(db.String(64))
    last_name = db.Column(db.String(64))

    @hybrid_property
    def username(self):
        return self.first_name + self.last_name
Run Code Online (Sandbox Code Playgroud)

文档显示了混合属性的这种用法:SQL Expressions as Mapped Attributes: Using a Hybrid。使用混合属性,您可以轻松地使用用户名来查询模型,并且不需要在数据库中存储两次数据。通过添加几行代码,您应该能够在即将发布的 SQLAlchemy v1.2 中创建更新结构

编辑:要明确说明 - 您也可以使用column_property(如链接文档中所述):

username = column_property(first_name + last_name)
Run Code Online (Sandbox Code Playgroud)

这可能看起来更好但功能较弱(除其他外没有更新语句)。

附注。我敢打赌这是重复的,但我找不到相同的问题。