2013-11-15 2 views
1

У меня есть основной один ко многим отношений:SQLAlchemy внешний ключ отложенной загрузки

class Term(Base): 
    __tablename__ = 'term' 
    id = Column(Integer, primary_key=True) 

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    term = Column(Integer, ForeignKey('term.id')) 

Но когда я загрузить объект Node, доступ к свойству «термин», я просто получить числовой термин идентификатор, а не срок объект.

node = session.query(Node).filter(Node.id == 1).one() 
print node.term # 123 

Как получить поля внешнего ключа для ленивой загрузки объекта?

Большое спасибо. Бен

ответ

1

, потому что ваш атрибут term является Column, SQLAlchemy отображает его как значение этого столбца. Вы можете получить SQLAlchemy фактически загрузить референт строку с помощью relationship:

from sqlalchemy.orm import relationship 

class Term(Base): 
    __tablename__ = 'term' 
    id = Column(Integer, primary_key=True) 

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    term = Column(Integer, ForeignKey('term.id')) 
    related_term = relationship(Term, backref="nodes") 

Поскольку my_node.related_term выглядит немного странно, я предпочитаю именование иметь столбец называется table_column, а не просто table, так что я могу также укажите атрибут relationship после таблицы, вместо того, чтобы изобретать другое нечетное имя.

+0

Блестящий. Это сортирует его, и я тоже использую этот наконечник. Огромное спасибо. –

0

Используйте возвращаемое значение node.term для нового запроса, чтобы получить связанные объекты:

node = session.query(Node).filter(Node.id == 1).one() 
related_term = session.query(Term).filter(Term.id == node.term).one() 
+0

Это очень похоже на то, что Бен просит, явно загружая этот объект, в основном отрицает значение использования ORM, где вы можете игнорировать постоянство данных на диске и рассматривать их как обычные объекты python. – SingleNegationElimination

+0

Большое спасибо, я довольно много новичок в SQLAlchemy haha. Будет весело учиться у вас, сэр! – aIKid

Смежные вопросы