2017-06-14 24 views
1

は彼らのdocsの例に見られるように、指定したクラスの下に新しいプロパティを宣言することができます:フラスコSQLAlchemyの後方参照の機能と後方参照パラメータ

class Person(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    addresses = db.relationship('Address', backref='person', lazy='dynamic') 

class Address(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    email = db.Column(db.String(50)) 
    person_id = db.Column(db.Integer, db.ForeignKey('person.id')) 

しかし、その後、backref機能もあります。この場合は

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50)) 
    addresses = db.relationship('Address', 
           backref=db.backref('person', lazy='joined'), 
           lazy='dynamic') 

は、特に複数ので、backrefパラメータに渡されたbackref機能の役割を何の定義は? backref='person'とどのように違うのですか?ドキュメントから

+0

backrefオブジェクトを使用して、後方参照関係の動作/構成を変更できます。あなたのケースでは 'Address.person'がローディングに参加しました。文字列だけを渡すと、デフォルト値が得られます。 –

+0

@IljaEverilä 'lazy = 'dynamic''もローディング設定を変更しませんか?私はこれが私を混乱させていると思う。 – kentwait

+0

はい。キーワード引数が渡される関係の設定が変更されます。あなたの場合は 'User.addresses'です。 –

答えて

0

後方参照は、アドレスクラスに新しいプロパティを宣言するための簡単な方法です。 my_address.personを使用してそのアドレスにいる人にアクセスすることもできます。 lazyは、SQLAlchemyがデータベースからデータをロードするタイミングを定義します。

'select'(デフォルト)は、SQLAlchemyが標準select文を使用して必要に応じてデータを必要に応じてロードすることを意味します。

'joined'は、JOIN文を使用して親と同じクエリで関係をロードするようにSQLAlchemyに指示します。

'subquery'は 'joined'のように動作しますが、SQLAlchemyはサブクエリを使用します。

「ダイナミック」は、多くのアイテムがある場合は特別で便利です。アイテムをロードする代わりに、SQLAlchemyは別のクエリオブジェクトを返します。このオブジェクトは、アイテムをロードする前にさらに細かく調整できます。これは、通常、この関係のためのアイテムがほんの一握り以上の場合に必要なものです。

SRC:http://flask-sqlalchemy.pocoo.org/2.1/models/

+0

はい私はこの部分を理解しています。私の質問は、backrefパラメータに渡されるbackref関数の役割は何ですか。 'db.relationship( 'Address'、backref = 'person'、lazy = 'dynamic')とはどのような違いがありますか? – kentwait

+0

関数呼び出しの中でそれ以上カスケードすることはできません。スコープの問題と冗長性をカプセル化するために、この関数を作成したと思います。 –

1

二怠惰は後方参照のために怠惰な状態を定義します。例えば:

アドレス= db.relationship( '住所'、 後方参照= db.backref( '人'、遅延=) '接合'、遅延= '動的')

怠惰= 'joined' 'person'の遅延ステータスを定義する lazy = 'dynamic'アドレスの遅延ステータスを定義する

関連する問題