Flask SQLAlchemy backref函数和backref参数

2024-04-24 03:50:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在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'有何不同?


Tags: keyidtruedbstringmodeladdresscolumn
2条回答

第二个lazy定义backref的lazy状态。例如:

addresses = db.relationship('Address', backref=db.backref('person', lazy='joined'), lazy='dynamic')

lazy=“joined”定义“person”的lazy状态 lazy=“dynamic”定义地址的延迟状态

从文档中:

backref是在Address类上声明新属性的简单方法。你也可以用我的地址找到那个地址的人。lazy定义SQLAlchemy何时从数据库加载数据:

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

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

“subquery”的工作方式类似于“joined”,但SQLAlchemy将使用子查询。

“dynamic”是特别的,如果您有很多项,它会很有用。SQLAlchemy将返回另一个查询对象,您可以在加载项之前进一步优化该对象,而不是加载项。这通常是你想要的,如果你对这段关系的期望超过了一小部分。

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

相关问题 更多 >