Ответ 1
Если вы хотите установить истинное отношение "один к одному", вам также необходимо использовать "uselist = False" в определении отношений.
bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)
Каков наилучший способ создания отношения "один к одному" в SQLAlchemy с использованием декларативного?
У меня есть две таблицы foo
и bar
, и я хочу, чтобы foo.bar_id
ссылался на bar
. Уловка заключается в том, что это взаимно однозначное отношение. bar
ничего не должен знать о foo
. Для каждого foo будет один и только один bar
.
В идеале, после выбора foo, я мог бы сделать что-то вроде этого:
myfoo.bar.whatever = 5
Какой лучший способ выполнить это с помощью декларативного?
Если вы хотите установить истинное отношение "один к одному", вам также необходимо использовать "uselist = False" в определении отношений.
bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)
Документация объясняет это красиво:
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)
Я думаю, что если это действительно одно к одному, мы должны добавить ограничение уникальности для внешнего ключа, чтобы другой родитель не мог иметь другого родительского ребенка!! Вот так:
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)