我如何拥有一对多关系并使用不同的列加入?

时间:2016-06-10 15:29:05

标签: python sqlalchemy

我正在使用2个模型。

class Foo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    desc = db.Column(db.String(30))

    bars = db.relationship('Bar', back_populates='foo')


class Bar(db.Model):
    key_1 = db.Column(db.String('64'), primary_key=True)
    key_2 = db.Column(db.String('64'), primary_key=True)
    up_foo = db.Column(db.String('64'), primary_key=True)

    foo_id = Column(Integer, ForeignKey('foo.id'))
    foo = relationship('Foo', back_populates='bars')

我要做的是加入FooBar,但是来自up_foo表格的Bar字段。我的查询看起来像

select * from foo f
inner join bar b on f.id = b.up_foo

但似乎无论我在哪种方式配置我的关系,我都会遇到2个错误之一。第一个是SQLAlchemy无法找到任何相关的外键列。第二个是我无法将列up_foo映射两次,因为它已经是主键,因此也无法将其映射为外键。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您绝对可以指出其中一列既是复合primary key的一部分,也是foreign_key的一部分。当然,它还要求这些列具有相同的类型。下面的代码应该可以正常工作:

class Foo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    desc = db.Column(db.String(30))

    bars = db.relationship('Bar', back_populates='foo')


class Bar(db.Model):
    key_1 = db.Column(db.String(64), primary_key=True)
    key_2 = db.Column(db.String(64), primary_key=True)
    up_foo = db.Column(db.Integer, db.ForeignKey('foo.id'), primary_key=True)

    foo = db.relationship('Foo', back_populates='bars')

在这种情况下,您的查询非常简单,因为您甚至不需要指定连接条件:

q = db.session.query(Foo, Bar).join(Bar)