Flask-SQLAlchemy backref 函数和 backref 参数

ken*_*ait 18 python sqlalchemy flask flask-sqlalchemy

在 Flask-SQLAlchemy 中,关系方法中的 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'))
Run Code Online (Sandbox Code Playgroud)

但是还有一个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')
Run Code Online (Sandbox Code Playgroud)

在这种情况下,backref传递给backref参数的函数的作用是什么,尤其是多个lazy定义?它与 有什么不同backref='person'

Ric*_*Han 10

来自Flask 模型的文档

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

select (这是默认设置)意味着 SQLAlchemy 将使用标准的 select 语句根据需要一次性加载数据。

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

subquery 像“joined”一样工作,但相反,SQLAlchemy 将使用子查询。

dynamic如果你有很多物品,它是特别和有用的。SQLAlchemy 不会加载项目,而是返回另一个查询对象,您可以在加载项目之前进一步细化。如果您期望这段关系中的项目不止少数,这通常就是您想要的。

  • 是的,我理解这部分。我的问题是传递给 backref 参数的 backref 函数的作用是什么。它与 db.relationship('Address', backref='person', lazy='dynamic')` 有什么不同 (3认同)
  • 不可能在函数调用中进一步级联。我猜他们创建这个函数是为了封装范围问题和冗余。 (2认同)