Python 一对多关系和Fk列位置

Python 一对多关系和Fk列位置,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,我一直在处理一对多和多对一的关系,我发现sqlalchemy文档和flask sqlalchemy文档之间的文档不同 SqlAlchemy声明Relationship()应该在父级中,而Fk列应该在子级中。《炼金术》指出,这两者都应该在孩子身上 炼金术: class Post(db.Model): id = db.Column(db.Integer, primary_key=True) category_id = db.Column(db.Integer, db.ForeignK

我一直在处理一对多和多对一的关系,我发现sqlalchemy文档和flask sqlalchemy文档之间的文档不同

SqlAlchemy声明
Relationship()
应该在父级中,而
Fk列应该在子级中。《炼金术》指出,这两者都应该在孩子身上

炼金术:

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))
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'))
炼金术:

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))
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'))

哪一个是正确的,和/或有什么区别?

它们都是正确的。SQLAlchemy和SQLAlchemy都没有直接说明关系的发展方向,尽管他们的例子可能倾向于其中一个。唯一的区别是,第一个示例关系具有,因此可以从两个模型访问该关系,而第二个示例只有父模型具有relationship属性

在大多数情况下,我将关系添加到具有外键的同一个模型中,并添加一个backref,以便可以从相关模型访问它。您可能只需要一方的关系,所以在决定做什么时,这取决于您的特定用例。另一种情况是,您希望在两个模型上明确定义关系,而不是使用
backref