2017-09-15 44 views
0

我寫了一個小工具,可以從書面規範中創建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

在第一個示例中,Person可以只有一個地址,但每個地址可以被多個人使用。 在您的第二個解決方案中,人員現在可以擁有多個地址,但每個地址對於給定的人員都是唯一的(請注意,ForeignKey移動了表格)。

所以你從N:1變成了1:N。通過說你想要一個N側的列表,而不是一側的實例,你現在必須指定更多。

+0

我知道,這就是爲什麼我問。沒有1:1的例子可以找到,1:N例子都有(對我來說)多餘的backref事情。我想知道如何做1:1的最簡單的方法,所以我不必在有人的時候對地址進行第二次查詢。 – ramdyne