Question

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`.

  • How can I create such relationship, spread/mapped to two tables' columns?

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 = ...
Était-ce utile?

La solution

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top