2017-08-12 7 views
1

私はWebアプリケーションを構築しています。私は次のモデルを持っています。同じモデルの2つの他の列に基づいて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 

私はusernameフォームでのみ彼の最初と最後の名前を入力し、ユーザとfirst_name+last_nameになりたいです。

私は@db.event.listens_for(Staff, "after_insert")などの使い方を知っており、そのように更新しています。しかし、モデル内に何かを定義する方法があるので、それはtrigerなしで自動的に行いますか? `

答えて

2

デコレータpropertyをよく知っているはずです。

SQLAlchemyには、hybrid_propertyエクステンションがあり、私はこれを学び、使用することを強くお勧めします。例を見てみましょう:SQL Expressions as Mapped Attributes: Using a Hybrid

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 

ドキュメントが正確にハイブリッドの特性のために、このような使用方法を示しています。ハイブリッドプロパティを使用すると、ユーザ名を簡単に使用してモデルを照会でき、データベースにデータを2回格納する必要はありません。いくつかの行を追加すると、今後のSQLAlchemy v1.2ではcreate update constructsにできるはずです。

編集:明示的に状態に - (リンクdocumentationに記載されているように)あなたもcolumn_propertyを使用することができます。良く見えるが、あまり強力であることが

username = column_property(first_name + last_name) 

は、(他の人の間には更新文を持っていません)。

PS。私はこれが重複していると確信していますが、私は同じ質問を見つけることができません。

+0

答えに「db.Column(db.String(64))」というユーザー名がある場合は、私はまたそれを列として書くことができますか? –

+0

'username'は列ではありません。データベースには格納されませんが(良いことですが)、カラムのように動作します*。たとえば、以前に作成された 'Staff(first_name = 'John'、last_name = 'Smith')'を持つと、 'Staff.query.filter_by(username = 'John Smith')。 – krassowski

+0

'username'の最大の違いは128です。バリデーターを使用して2つの列の長さを制限することができます。この議論を参照してください:https://stackoverflow.com/a/18580815/6646912 – krassowski

関連する問題