【发布时间】:2018-05-27 17:45:48
【问题描述】:
我有两个表,foo 和 bar,我希望 foo.bar_id 链接到 bar。问题是这是一种单向的一对一关系。 bar一定对foo一无所知。对于每个 foo,将只有一个 bar。
理想情况下,在选择 foo 后,我可以执行以下操作:
myfoo.bar.whatever = 5
如何做到这一点?
【问题讨论】:
标签: sqlalchemy
我有两个表,foo 和 bar,我希望 foo.bar_id 链接到 bar。问题是这是一种单向的一对一关系。 bar一定对foo一无所知。对于每个 foo,将只有一个 bar。
理想情况下,在选择 foo 后,我可以执行以下操作:
myfoo.bar.whatever = 5
如何做到这一点?
【问题讨论】:
标签: sqlalchemy
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
child = relationship("Child", uselist=False, backref="parent")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
或
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
child_id = Column(Integer, ForeignKey('child.id'))
child = relationship("Child", backref=backref("parent", uselist=False))
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
【讨论】:
如果您想要真正的一对一关系,您还必须在关系定义中使用“uselist=False”。
bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)
【讨论】:
uselist 关键字没有影响。请参阅answer of chadwick.boulay 以获得正确的解决方案。
我认为如果它是真正的一对一关系,我们应该为外键添加唯一性约束,这样另一个父母就不能有另一个父母孩子!像这样:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
child_id = Column(Integer, ForeignKey('child.id'), unique=True)
child = relationship("Child", backref=backref("parent", uselist=False))
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
【讨论】:
事实证明,这实际上很容易。在您的 Foo 模型中:
bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar)
【讨论】: