2013-09-19 6 views
0

У меня аналогичная настройка для классической модели клиентов/заказов. В моем случае это данные SEC, где одна модель отображает тикеры в CIK (который является идентификатором SEC для объектов отчетности). CIK и тикер уникальны для каждой компании. В другой таблице содержится информация о отчетах; компания может иметь несколько отчетов (квартальные доходы, годовые ..). Я использую CIK в качестве внешнего ключа для связывания тикеров и отчетов.Фильтрация внешнего ключа SQLAlchemy с использованием поля, отличного от поля внешнего ключа

Цель состоит в том, чтобы фильтровать по тикер и получать все отчеты, связанные с компанией. Следующие Постулаты «работают» (как это, не возвращается никакой ошибки), но получают отчеты от всех компаний, а не только требуется один (например, отчеты Yahoo,):

for instance in session.query(SEC_RSS_Model).filter(CIK_Model.ticker == 'YHOO'): 
    print instance.edgarlink 

выше утверждение выводит все содержимое SEC_RSS (таблица, связанная с SEC_RSS_Model), а именно, фильтрация вообще не происходит.

Моего SQLAlchemy модель:

class CIK_Model(Base): 
    __tablename__ = 'CIK_Table' 
    id = Column(Integer, primary_key=True) 
    CIK = Column(String(10), unique=True) 
    ticker = Column(String(8)) 
    RSS = relationship("SEC_RSS_Model", backref="CIK_Table") 

def __init__(self, CIK, ticker): 
    self.CIK = CIK 
    self.ticker = ticker 

def __repr__(self): 
    return "<CIK_Table('%s','%s')>" % (self.CIK, self.ticker) 

и

class SEC_RSS_Model(Base): 
    __tablename__ = 'SEC_RSS' 
    id = Column(Integer, primary_key=True) 
    CIK = Column(String(10),ForeignKey ("CIK_Table.CIK")) 
    edgarlink = Column(String(128), unique=True) 

    def __init__(self, CIK, edgarlink): 
     self.CIK = CIK 
     self.edgarlink = edgarlink 

    def __repr__(self): 
     return "<SEC_RSS('%s','%s')>" % (self.CIK, self.edgarlink) 

Что я определение здесь не так? Является ли эта модель «много-к-одному» или «один-ко-многим»? Правильно ли установлена ​​связь?

ответ

0

Вам нужно зарегистрироваться на связи для запроса на работу:

session.query(SEC_RSS_Model).join(SEC_RSSL_Model.CIK_Table).filter(CIK_Model.ticker == 'YHOO') 
Смежные вопросы