简体   繁体   English

Flask-SQLAlchemy:更新一对多关系

[英]Flask-SQLAlchemy: Update a One to Many Relationship

I have two Models: 我有两个模型:

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

If I, eg, create an instance of post and append it to a project via projectInstance.append(post(headline="...", content="...")) 例如,如果我创建了一个post实例,并通过projectInstance.append(post(headline="...", content="..."))将其附加到项目中
Now I want to update the project to which the post should belong to. 现在,我想更新帖子所属的项目。 Is there an easier way besides querying the desired project, append the post to it and remove it from the old project? 除了查询所需的项目,将帖子附加到该项目并将其从旧项目中删除,还有没有更简单的方法?

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

Do it the other way around: use the back reference in Post : 另一种方法是:使用Post的向后引用:

post.projects = newProject

This'll handle the required session management. 这将处理所需的会话管理。 Here's a minimal example: 这是一个最小的示例:

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

Also just appending the post instance to the newProject.post collection handles removing automatically, as can be seen with our as and bs: 同样,只需将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>])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM