通过一个Model实例上的多对多关系添加的数据会附加到许多实例

时间:2017-01-31 18:43:36

标签: python sqlalchemy many-to-many flask-sqlalchemy

我有一个简单的多对多关系,如下所示:

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(128))
    tags = db.relationship('Tag', secondary=tags,
        backref=db.backref('pages', lazy='dynamic'))

class Tag(db.Model):
    name = db.Column(db.String(128))
    id = db.Column(db.Integer, primary_key=True)

我有一些yaml格式的数据:

Page 1:
  - tag1
  - tag2
Page 2:
  - tag3
  - tag4

加载时看起来像这样:

data = {'Page 1': ['tag1', 'tag2'], 'Page 2': ['tag3', 'tag4']}

当我尝试将其插入数据库时​​:

def load_data():
    for page_title in data:
        p = (Page.query.filter_by(title=page_title).first() or
            Page(
                title=page_title
            )
        )

        for tag_name in data[page_title]:
            t = (Tag.query.filter_by(name=tag_name).first() or
                Tag(
                    name=tag_name
                )
            )

            p.tags.append(t)
        db.session.add(p)
        db.session.commit()

然后再把它丢弃:

def dump_data():
    pages = Page.query.all()
    for p in pages:
        print p.title + ":"
        for t in p.tags:
            print "  - " + t.name

标签与多个页面相关联:

Page 1:
  - tag1
  - tag3
  - tag4
  - tag2
Page 2:
  - tag2
  - tag3
  - tag4

我不知道为什么。 (这不是转储方法,因为我已经通过flask-admin确认了数据库中存在关系。)感谢任何帮助!

(我应该补充一点,我是Python,Flask和Flask-SQLAalchemy的新手,所以我在进行这项工作的时候就这么做了!但是我已经读过这个并尝试了多种替代方案,但无济于事。)

1 个答案:

答案 0 :(得分:0)

事实证明这是非常简单的,需要花费很长时间才能发现 - 我曾在某些时候删除了Page和Tag数据,但没有删除它们的关联,因此新数据获得了旧的和新的关联!