2013-11-19 4 views
0

У меня есть два класса, сопоставленные с двумя таблицами соответственно.SQLAlchemy Linear One-to-One Relationship

Пример: Obj 1: ID (PK), KEY (String(20)) Obj 2: ID (PK), obj_1_id (FK), value (String(20))

Я хотел бы иметь возможность выполнять obj_1.value = *val*, в результате чего вал хранится на соответствующем столбце таблицы secon'd, вместо obj_1.value.value = val `.

  • Как создать такие отношения, разложить/сопоставить столбцам двух таблиц?

То, что я хочу не один-к-одному (объект имеет объект), а карта столбца объекта в другую таблицу.

Ниже я попробовал (после Docs), и он не работает, поскольку он создает 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

Почему не только оберните свойство 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 
+0

Благодарим вас за это решение. Он решает проблему, но чувствует себя немного сложным. Должен ли быть (или нет) более простой способ сделать такое сопоставление с SA? – Phil

+0

Вы можете написать собственный конструктор/оболочку, чтобы скрыть всю сложность. – van