SQLAlchemy外键过滤,使用与外键字段不同的字段

时间:2013-09-19 14:26:56

标签: python sqlalchemy

我对客户列表/订单'经典'模型有类似的设置。在我的情况下,它是SEC数据,其中一个模型将代码映射到CIK(这是SEC的报告实体的id#)。 CIK和自动收报机对每家公司都是独一无二的。另一张表载有关于报告的信息;公司可以有多个报告(四分之一的收入,年度......)。我正在使用CIK作为打包代码和报告的外键。

目标是通过自动收录器进行过滤,并获取与公司相关的所有报告。以下声明“有效”(因为没有返回错误),但会检索所有公司的报告,而不仅仅是所需的报告(例如,雅虎的报告):

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) 

我在这里定义错了什么?这种模式是多对一还是一对多?关系设置正确吗?

1 个答案:

答案 0 :(得分:0)

您需要加入关系才能使查询正常工作:

session.query(SEC_RSS_Model).join(SEC_RSSL_Model.CIK_Table).filter(CIK_Model.ticker == 'YHOO')