sqlalchemy: личные отношения с декларативным - PullRequest
45 голосов
/ 12 августа 2010

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

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

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

myfoo.bar.whatever = 5 

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

Ответы [ 4 ]

105 голосов
/ 08 марта 2012

В документации это хорошо объясняется :

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)
35 голосов
/ 01 декабря 2010

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

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)
4 голосов
/ 12 мая 2017

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

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)
2 голосов
/ 12 августа 2010

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

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...