4

所以我花了一些时间在这上面,一直在兜圈子,一无所获,所以我想我会去找专家!

使用Flask 0.9并且SQLAlchemy 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 个类映射在一起的材料。

我真的很感谢你们为此提供的任何意见和见解,谢谢!!

4

1 回答 1

3

我认为您的数据库设置正确,您有两个一对多的关系,这似乎很好。

SQLAlchemy 的“无法确定...”错误只是说您的模型中没有足够的信息让 SQLAlchemy 确定子图库和照片表之间关系的连接条件。

SQLAlchemy 试图从你如何命名事物中猜测很多东西,它期望一致性。我相信在这种情况下,由于您使用了 camel case,它没有找到它需要的东西SubGallery

正如错误消息所暗示的那样,您可以向关系添加一个明确的primaryjoin参数,然后 SQLAlchemy 会很高兴,或者您可以更改您的名称以帮助 SQLAlchemy 自行解决。

我通过重命名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
于 2013-07-16T06:59:42.573 回答