2016-12-23 22 views
0

次のモデルを使用してデータを格納しています。Flask-SQLAlchemy:フェッチ時にデータの属性を操作する

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    timestamp=db.Column(DateTime(timezone=True), nullable=False) 


    def __init__(self, username, timestamp=None): 
     self.username = username 
     if timestamp is None: 
      timestamp =datetime.datetime.now() 
     self.timestamp = timestamp 

    def __repr__(self): 
     return '<User %r>' % self.username 

は今、私の質問は:

user = User.query.filter_by(username='admin').first() 

を使用してデータをフェッチするとき、私は、データをフェッチし、Userオブジェクトに変換されることを理解できますか?

私が達成したいのは、上記のようにクエリを使用してデータを取得すると、データが自動的に操作されるということです。

つまり、私の場合は、タイムスタンプが認識されています。私はこれを行うためにpytz.localize()を使用します。

私が試した:

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    timestamp=db.Column(DateTime(timezone=True), nullable=False) 


    def __init__(self, username, timestamp=None): 
     self.username = username 
     if timestamp is None: 
      timestamp =datetime.datetime.now() 
     timestamp = pytz.utc.localize(timestamp) 
     self.timestamp = timestamp 

    def __repr__(self): 
     return '<User %r>' % self.username 

を私はそれが動作しない、

if(timestamp is none) 
    new entry 
    initialize timestamp 
make timezone aware  #even if fetched from db 
self.timestamp=timestamp` 

、オブジェクトが初期化されるときに、のようなものと考えた。しかし。 __init__は、データを照会するときに呼び出されません。何ができますか?

答えて

1

行からオブジェクトを再作成するときに__init __()を使用しないことがsqlalchemyのマニュアルに記載されています。

参照: データベース行からオブジェクトを再作成するときhttp://docs.sqlalchemy.org/en/latest/orm/constructors.html

SQLAlchemyのORMは__init__呼び出すことはありません。 ORMのプロセスはPython 標準ライブラリのpickleモジュールに似ていますが、低レベルの__new__ メソッドを呼び出し、__init__を呼び出すのではなく、インスタンス に直接属性を静かに復元します。

あなたは彼らが使用する準備が整いました 前に、データベース・ロードのインスタンス上でいくつかの設定を行う必要がある場合、あなたは__init__するORMの対応として 方法をタグ付けする@reconstructorデコレータを使用することができます。 SQLAlchemyは、インスタンス のいずれかをロードまたは再構築するたびに、引数なしでこの メソッドを呼び出します。これは通常、あなたの__init__に割り当てられている過渡的性質 を再作成するのに便利です:

from sqlalchemy import orm 

class MyMappedClass(object): 
    def __init__(self, data): 
     self.data = data 
     # we need stuff on all instances, but not in the database. 
     self.stuff = [] 

    @orm.reconstructor 
    def init_on_load(self): 
     self.stuff = [] 
+0

うわー。これは私が探していた事実です。しかし、私はなぜそれが機能していないのか分かりません。私は '''@orm.reconstructor デフinit_on_load(自己)を追加しました: self.timestamp = pytz.utc.localize(self.timestamp) '' ' プリント "と呼ばれるREonstructorを" しかし、何のメッセージが印刷されません取得します。 –

+0

私のプロジェクト(Python 3.4)でテストしただけでなく、printステートメントを追加してメッセージを出力します。 –

+0

@Stjinマシンでは動作しません。 Ubuntuを動かしているVMを試してみました。それをもっと見ていきます。どうもありがとう。私は2日以来それに固執していた。たくさんのことを試しましたが、「再構成」という言葉は私の心の近くに来ませんでした。 –

関連する問題