2013-07-16 50 views
4

所以我花了一些時間在這個上,並繼續圍繞圈子跑來跑去,所以我想我會來專家!燒瓶SQLAlchemy - 需要幫助映射3個類一起

使用Flask 0.9SQLAlchemy 0.7.9我正在嘗試創建一個具有圖庫集合的圖庫頁面。每個畫廊都有一系列的子畫廊,每個子畫廊都有一系列照片。下面清楚地表明我的第一次嘗試不起作用:

class Gallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    subgals = db.relationship('SubGallery', backref='author', lazy='dynamic') 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class SubGallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    photos = db.relationship('Photo', backref='author', lazy='dynamic') 
    gallery_id = db.Column(db.Integer, db.ForeignKey('gallery.id')) 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class Photo(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    href = db.Column(db.String(128)) 
    subgallery_id = db.Column(db.Integer, db.ForeignKey('subgallery.id')) 

    def __repr__(self): 
     return '<Photo - %r>' % (self.title) 

,並返回該錯誤:

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship SubGallery.photos. Specify a 'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin' is needed as well. 

我一直在研究替代關係配置,但我不知道100%,我需要什麼。 我的直覺告訴我,我需要一個Adjacency Relationship,但我一直沒有得到很大的回報。我嘗試了多次映射,但是我沒有看到很多材料如何將3個類映射到一起。

我真的很感謝你們所有人對此提供的意見和見解,謝謝!

回答

3

我認爲你的數據庫設置正確,你有兩個一對多的關係,這似乎很好。

SQLAlchemy的「無法確定...」錯誤只是說您的模型中沒有足夠的信息來確定SQLAlchemy的子畫廊和照片表之間關係的連接條件。

SQLAlchemy試圖從你如何命名事物中猜測很多事情,它期望一致性。我相信在這種情況下,由於您使用駱駝案件SubGallery,因此無法找到需要的東西。

您可以根據錯誤消息的建議在關係中添加一個明確的primaryjoin參數,然後SQLAlchemy會很高興,否則您可以更改名稱以幫助SQLAlchemy自行解決問題。

我修改了您的定義,將SubGallery重命名爲'Subgallery`,這似乎工作。下面是改款車型:

class Gallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    subgals = db.relationship('Subgallery', backref='author', lazy='dynamic') 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class Subgallery(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    photos = db.relationship('Photo', backref='author', lazy='dynamic') 
    gallery_id = db.Column(db.Integer, db.ForeignKey('gallery.id')) 

    def __repr__(self): 
     return '<Gallery - %r>' % (self.title) 


class Photo(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.String(64)) 
    href = db.Column(db.String(128)) 
    subgallery_id = db.Column(db.Integer, db.ForeignKey('subgallery.id')) 

    def __repr__(self): 
     return '<Photo - %r>' % (self.title) 

而且我用這個小快速和骯髒的測試腳本,以確保關係進行工作:

db.create_all() 
g = Gallery(title = "a") 
db.session.add(g) 
db.session.commit() 
sg = Subgallery(title = "a1", author = g) 
db.session.add(sg) 
db.session.commit() 
p = Photo(title = "a1p", href="href", author = sg) 
db.session.add(p) 
db.session.commit() 
for subgal in g.subgals.all(): 
    print subgal 
    print subgal.author 
    for photo in subgal.photos.all(): 
     print photo 
     print photo.author 
+0

是!非常感謝!工作就像一個魅力:D – rogueSF