Подтвердить что ты не робот

Sqlalchemy: индивидуальная связь с декларативным

Каков наилучший способ создания отношения "один к одному" в SQLAlchemy с использованием декларативного?

У меня есть две таблицы foo и bar, и я хочу, чтобы foo.bar_id ссылался на bar. Уловка заключается в том, что это взаимно однозначное отношение. bar ничего не должен знать о foo. Для каждого foo будет один и только один bar.

В идеале, после выбора foo, я мог бы сделать что-то вроде этого:

myfoo.bar.whatever = 5 

Какой лучший способ выполнить это с помощью декларативного?

4b9b3361

Ответ 1

Если вы хотите установить истинное отношение "один к одному", вам также необходимо использовать "uselist = False" в определении отношений.

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)

Ответ 2

Документация объясняет это красиво:

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)

Ответ 3

Я думаю, что если это действительно одно к одному, мы должны добавить ограничение уникальности для внешнего ключа, чтобы другой родитель не мог иметь другого родительского ребенка!! Вот так:

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)

Ответ 4

Оказывается, это на самом деле довольно легко. В вашей модели Foo:

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar)