2017-06-14 169 views
1

在烧瓶SQLAlchemy中,在关系法backref参数允许您指定类下宣布一个新的属性,如在本例中看到他们的docs烧瓶SQLAlchemy的backref功能和backref参数

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'有什么不同?

+0

使用backref对象可以更改反向引用关系的行为/配置。在你的情况下'Address.person'已加入配置加载。当你只传递一个字符串时,你会得到默认值。 –

+0

@IljaEverilä不'lazy ='dynamic''也会改变加载配置吗?我认为这是什么令我困惑 – kentwait

+0

是的。它改变了关键字参数传递给关系的配置。在你的情况'User.addresses'。 –

回答

0

从文档:

backref是一个简单的方法也宣告地址类的新属性。然后,您也可以使用my_address.person找到该地址的人。懒惰定义SQLAlchemy何时会从数据库加载数据:

'select'(这是默认值)意味着SQLAlchemy将使用标准选择语句随时加载数据。

'joined'告诉SQLAlchemy使用JOIN语句在与父代相同的查询中加载关系。

“子查询”的工作方式与“加入”类似,但SQLAlchemy将使用子查询。

如果您有很多项目,'动态'是特别有用的。加载项目SQLAlchemy将返回另一个查询对象,您可以在加载项目之前进一步细化。如果您期望这种关系不止一个项目,这通常是您想要的。

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

+0

是的,我明白这个部分。我的问题是传递给backref参数的backref函数的作用是什么。它与db.relationship('Address',backref ='person',lazy ='dynamic')有什么不同? – kentwait

+0

函数调用内部不可能级联。我想他们创建了这个函数来封装范围问题和冗余。 –

1

第二懒惰定义backref懒惰状态。例如:

地址= db.relationship( '地址', backref = db.backref( '人',懒惰= '接合'),懒惰= '动态')

懒惰='joined'定义'人'的懒惰状态 lazy ='dynamic'定义地址的懒惰状态