Flask-SQLAlchemy backref函数和backref参数

时间:2017-06-14 08:02:02

标签: python flask sqlalchemy flask-sqlalchemy

在Flask-SQLAlchemy中,关系方法中的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'有什么不同?

2 个答案:

答案 0 :(得分:3)

来自文档:

backref是一种在Address类上声明新属性的简单方法。然后,您还可以使用my_address.person访问该地址的人员。 lazy定义SQLAlchemy何时从数据库加载数据:

'select'(这是默认值)意味着SQLAlchemy将使用标准select语句一次性加载数据。

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

'subquery'的工作方式类似于'join',而SQLAlchemy将使用子查询。

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

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

答案 1 :(得分:0)

第二个懒惰定义了backref的延迟状态。例如:

  

地址= db.relationship('地址',           backref = db.backref('person',lazy ='joined'),lazy ='dynamic')

lazy ='joined'定义'person'的懒惰状态 lazy ='dynamic'定义地址的延迟状态