【问题标题】:Flask-SQLAlchemy: Update a One to Many RelationshipFlask-SQLAlchemy:更新一对多关系
【发布时间】:2016-11-03 05:51:54
【问题描述】:

我有两个模型:

class Project(db.Model):
    __tablename__ = 'project'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    timestamp = db.Column(db.DateTime)
    info = db.Column(db.Text(255))

    post = db.relationship('Post', backref=db.backref('projects'))

class Post(db.Model):
    __tablename__ = 'post'

    id = db.Column(db.Integer, primary_key=True)
    headline = db.Column(db.String(64))
    content = db.Column(db.Text(255))
    timestamp = db.Column(db.DateTime)

    projectId = db.Column(db.Integer, db.ForeignKey('project.id'))

例如,如果我创建一个帖子实例并将其通过projectInstance.append(post(headline="...", content="..."))附加到项目中
现在我想更新帖子应该属于的项目。除了查询所需的项目,将帖子附加到它并将其从旧项目中删除之外,还有更简单的方法吗?

oldProject.remove(post)
newProject.append(post)

【问题讨论】:

  • 我认为您的关系中的单数和复数命名方式错误,因为 Post 只能引用 1 Project,但您的模型中的许多帖子都可以引用一个项目.
  • 这是一个好点,你有。谢谢!

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

反过来做:使用Post中的反向引用:

post.projects = newProject

这将处理所需的会话管理。这是一个最小的例子:

In [2]: class A(Base):
   ...:     __tablename__ = 'a'
   ...:     id = Column(Integer, primary_key=True, autoincrement=True)
   ...:     bs = relationship('B', backref='a')
   ...:

In [3]: class B(Base):
   ...:     __tablename__ = 'b'
   ...:     id = Column(Integer, primary_key=True, autoincrement=True)
   ...:     a_id = Column(Integer, ForeignKey('a.id'))
   ...:

In [5]: a1 = A()

In [6]: a2 = A()

In [7]: b = B()

In [8]: a1.bs.append(b)

In [9]: a1.bs
Out[9]: [<__main__.B at 0x7f7322fb52b0>]

In [10]: b.a = a2

In [11]: a1.bs, a2.bs
Out[11]: ([], [<__main__.B at 0x7f7322fb52b0>])

也只是将post 实例附加到newProject.post 集合中自动删除句柄,正如我们的 as 和 bs 所示:

In [9]: a1.bs.append(b)

In [10]: a1.bs, a2.bs
Out[10]: ([<__main__.B at 0x7f26702565f8>], [])

In [11]: a2.bs.append(b)

In [12]: a1.bs, a2.bs
Out[12]: ([], [<__main__.B at 0x7f26702565f8>])

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 2016-06-15
    • 2021-08-31
    • 1970-01-01
    • 2014-09-26
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多