如何解决" SQLAlchemy查询结果中的外键?

时间:2017-09-15 16:03:21

标签: python sqlalchemy flask-sqlalchemy

我编写了一个小工具,可以从书面规范中创建SQLAlchemy代码。该工具可以创建如下代码:

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    address_id = db.Column(db.Integer, db.ForeignKey('address.id'))

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))

我可以插入新记录,我可以查询它们,它就像一个魅力,但我真的不想手动寻找一个人的地址。

我希望能够通过Person对象访问属于特定人员的地址。如果我正确理解了这些例子,我需要这样做(例如基于http://flask-sqlalchemy.pocoo.org/2.1/models/#one-to-many-relationships)?

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    address = db.relationship('Address', backref='person',
                                lazy='dynamic')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))

这对我来说都是倒退,我必须给每个地址一个"链接"到一个人,然后backref所以我可以有一个人的地址?这是不可能直接从人做?

另外,为此创建代码要复杂得多,所以我真的很想避免这种情况。

1 个答案:

答案 0 :(得分:1)

在第一个示例中,Person可以有1个地址,但每个地址可以由多个人使用。 在第二个解决方案中,Person现在可以有多个地址,但每个地址对于给定的Person是唯一的(请注意,ForeignKey移动了表)。

所以你从N:1到1:N。通过说你想要一个N面的列表,而不是一面的实例,你现在必须指定更多。