Flask-SQLAlchemyでは、relationshipメソッドのbackrefパラメーターを使用すると、 docs の例に示すように、指定されたクラスで新しいプロパティを宣言できます。
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
パラメーターに渡されるlazy
関数の役割は何ですか? backref='person'
とどう違うのですか?
From Flaskモデル のドキュメント:
backref
は、Addressクラスで新しいプロパティを宣言する簡単な方法です。次に、my_address.person
を使用して、そのアドレスの人に連絡することもできます。 lazy
は、SQLAlchemyがデータベースからデータをロードするタイミングを定義します。
select
(デフォルト)は、SQLAlchemyが標準のselectステートメントを使用して必要に応じて一度にデータをロードすることを意味します。
joined
は、JOINステートメントを使用して、親と同じクエリでリレーションシップをロードするようにSQLAlchemyに指示します。
subquery
は 'joined'のように機能しますが、代わりにSQLAlchemyはサブクエリを使用します。
dynamic
は、アイテムが多い場合に特別で便利です。アイテムをロードする代わりに、SQLAlchemyは別のクエリオブジェクトを返します。これは、アイテムをロードする前にさらに絞り込むことができます。これは通常、この関係に一握り以上のアイテムを期待する場合に必要なものです。
2番目のレイジーは、backrefのレイジーステータスを定義します。例えば:
addresss = db.relationship( 'Address'、backref = db.backref( 'person'、lazy = 'joined')、lazy = 'dynamic')
lazy = 'joined'は 'person'のレイジーステータスを定義しますlazy = 'dynamic'はアドレスのレイジーステータスを定義します