SQLAlchemy线性一对一关系

时间:2013-11-19 11:28:39

标签: python sql sqlalchemy one-to-one

我有两个类分别映射到两个表。

实施例 Obj 1: ID (PK), KEY (String(20)) Obj 2: ID (PK), obj_1_id (FK), value (String(20))

我希望能够执行obj_1.value = *val*,其中 val 存储在secon'd表的相应列而不是 obj_1.value。 value = val `。

  • 如何创建这样的关系,传播/映射到两个表的列?

我想要的是一对一(对象HAS对象),而是将对象的映射到不同的表。

以下是我尝试过的(在文档之后)并且它不起作用,因为它创建obj1.value.value = ..而不是直接列映射

我尝试了什么:

class Obj1(Base):

    __tablename__ == ...

    id = ..
    key = ..

    value = relationship("Obj2", uselist=False, backref="obj1")

class Obj2(Base):

    __tablename__ == ...

    id = ..       # PK
    obj_1_id = .. # FK

    value = ...

1 个答案:

答案 0 :(得分:1)

为什么不包装python属性:

class Obj1(Base):
    __tablename__ = 'obj1'
    id = Column(Integer, primary_key=True)
    key = Column(String(20))

    _value_rel = relationship("Obj2", uselist=False, backref="obj1")

    @property
    def value(self):
        return self._value_rel and self._value_rel.value

    @value.setter
    def value(self, value):
        if value is None:
            self._value_rel = None
        elif self._value_rel is None:
            self._value_rel = Obj2(value=value)
        else:
            self._value_rel.value = value