【问题标题】:SQLAlchemy foreign key filtering, using a different field than the foreign key fieldSQLAlchemy外键过滤,使用与外键字段不同的字段
【发布时间】:2013-09-19 14:26:56
【问题描述】:

我有一个与客户列表/订单“经典”模型类似的设置。在我的例子中,它是 SEC 数据,其中一个模型将代码映射到 CIK(这是 SEC 报告实体的 id #)。每个公司的 CIK 和股票代码都是独一无二的。另一个表格包含有关报告的信息;一家公司可以有多个报告(季度收益、年度……)。我使用 CIK 作为绑定代码和报告的外键。

目标是按 ticker 过滤并获取与公司相关的所有报告。以下语句“有效”(原样,不返回错误),但检索所有公司的报告,而不仅仅是所需的报告(例如,雅虎的报告):

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) 

我在这里定义的错误是什么?这个模型是多对一还是一对多?关系设置是否正确?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您需要加入关系才能使查询起作用:

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

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      相关资源
      最近更新 更多