Skip to main content
 首页 » 编程设计

python之Flask-SQLAlchemy:更新一对多关系

2025年05月04日27rubylouvre

我有两个模型:

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')) 

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

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

请您参考如下方法:

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

post.projects = newProject 

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

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>])