【问题标题】:Data added through a many-to-many relationship on one Model instance gets attached to many instances通过一个模型实例上的多对多关系添加的数据会附加到多个实例
【发布时间】:2017-06-17 08:06:00
【问题描述】:

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

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 的新手,所以我边走边编!但我已经阅读了这个并尝试了多种替代方案,但均无济于事。)

【问题讨论】:

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


    【解决方案1】:

    事实证明这是一件非常简单的事情,需要很长时间才能发现 - 我曾在某些时候删除了页面和标签数据,但没有删除它们的关联,因此新数据同时具有新旧关联!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 2021-02-03
      • 2013-03-25
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多