One-to-many 关系和 Fk-column 位置
One-to-many relationship and Fk-column location
我一直在处理 one-to-many 和 many-to-one 关系,我发现 sqlalchemy 文档和 flask-sqlalchemy 文档之间的文档不同。
SqlAlchemy 声明 Relationship()
应该在 parent 中,而 Fk-Column
应该在 child 中。 Flask-Sqlalchemy 声明它应该都在 child.
中
Flask-SqlAlchemy:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
category = db.relationship('Category',
backref=db.backref('posts', lazy='dynamic'))
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
SqlAlchemy:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", backref="parent")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
哪个是正确的,and/or,有什么区别?
他们都是正确的。 SQLAlchemy 和 Flask-SQLAlchemy 都没有直接说明关系的发展方向,尽管它们的示例可能偏向于其中一个。唯一的区别是第一个示例关系具有 backref,因此可以从两个模型访问该关系,而第二个示例只有父模型具有关系 属性.
在大多数情况下,我将关系添加到具有外键的同一个模型以及一个反向引用,以便可以从相关模型访问它。您可能只需要一侧的关系,因此在决定做什么时取决于您的具体用例。另一种情况是当您想在两个模型上明确定义关系时,使用 back_populates
而不是 backref
.
我一直在处理 one-to-many 和 many-to-one 关系,我发现 sqlalchemy 文档和 flask-sqlalchemy 文档之间的文档不同。
SqlAlchemy 声明 Relationship()
应该在 parent 中,而 Fk-Column
应该在 child 中。 Flask-Sqlalchemy 声明它应该都在 child.
Flask-SqlAlchemy:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
category = db.relationship('Category',
backref=db.backref('posts', lazy='dynamic'))
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
SqlAlchemy:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", backref="parent")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
哪个是正确的,and/or,有什么区别?
他们都是正确的。 SQLAlchemy 和 Flask-SQLAlchemy 都没有直接说明关系的发展方向,尽管它们的示例可能偏向于其中一个。唯一的区别是第一个示例关系具有 backref,因此可以从两个模型访问该关系,而第二个示例只有父模型具有关系 属性.
在大多数情况下,我将关系添加到具有外键的同一个模型以及一个反向引用,以便可以从相关模型访问它。您可能只需要一侧的关系,因此在决定做什么时取决于您的具体用例。另一种情况是当您想在两个模型上明确定义关系时,使用 back_populates
而不是 backref
.