2017-08-12 76 views
1

我正在構建一個web應用程序。我有以下模型。如何根據同一模型的其他兩列設置sqlalchemy中的列值?

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 

我想usernamefirst_name+last_name與用戶在表單中輸入他的姓和名。

我知道如何使用@db.event.listens_for(Staff, "after_insert")等,並更新這樣的。但是有沒有一種方法可以在模型中定義一些東西,所以它可以在沒有三角形的情況下自動完成? `

回答

2

你應該熟悉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 

文檔顯示了混合屬性的這種用法:SQL Expressions as Mapped Attributes: Using a Hybrid。使用混合屬性,你可以很容易地使用用戶名來查詢您的模型,你不需要兩次存儲在數據庫中的數據。只需添加幾行代碼,即可在即將推出的SQLAlchemy v1.2中使用create update constructs

編輯:要明確說明它 - 你可以使用column_property太(如鏈接documentation說明):

username = column_property(first_name + last_name) 

其中可能更好看,但不那麼強大的(有在其他沒有更新語句)。

PS。我敢打賭這是重複的,但我找不到相同的問題。

+0

如果用戶名了'db.Column(db.String(64))'在你的答案?我是否也可以將它寫成列? –

+0

「用戶名」不是一列。它不會被存儲在數據庫中(這是一件好事),但會*表現爲像列一樣。例如,先前創建了Staff(first_name ='John',last_name ='Smith')',您可以用'Staff.query.filter_by(username ='John Smith')。one()'查詢它。 – krassowski

+0

和'username'的最大區別是128;你可以使用驗證器來限制兩列的sumaric長度。請參閱本討論:https://stackoverflow.com/a/18580815/6646912 – krassowski

相關問題