Phil
Phil

Reputation: 14641

SQLAlchemy Linear One-to-One Relationship

I have two classes mapped to two tables respectively.

Ex: Obj 1: ID (PK), KEY (String(20)) Obj 2: ID (PK), obj_1_id (FK), value (String(20))

I would like to be able to perform obj_1.value = *val*, whereby val is stored on the secon'd table's respective column, instead of obj_1.value.value = val`.

What I want is not one-to-one (object HAS object) but rather map a column of an object to a different table.

Following is what I have tried (following the docs) and it does not work as it creates obj1.value.value = .. instead of direct column mapping

What I have tried:

class Obj1(Base):

    __tablename__ == ...

    id = ..
    key = ..

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

class Obj2(Base):

    __tablename__ == ...

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

    value = ...

Upvotes: 0

Views: 65

Answers (1)

van
van

Reputation: 76952

Why not just wrap the python property:

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

Upvotes: 1

Related Questions