使用SQLAlchemy OrderingList更新现有对象的顺序

时间:2019-03-31 18:33:05

标签: python mysql orm sqlalchemy

当我使用SQLAlchemy排序列表时,我正在尝试更新现有对象的顺序。这是SQLAlchemy docs中使用的示例模型:

class Slide(Base):
    __tablename__ = 'slide'

    id = Column(Integer, primary_key=True)
    name = Column(String)

    bullets = relationship("Bullet", order_by="Bullet.position",
                            collection_class=ordering_list('position'))

class Bullet(Base):
    __tablename__ = 'bullet'
    id = Column(Integer, primary_key=True)
    slide_id = Column(Integer, ForeignKey('slide.id'))
    position = Column(Integer)
    text = Column(String)

我知道如何使用新对象调用append(),并且效果很好。

但是如何更新现有对象的顺序?

我已经尝试过了,结果有些难以理解。

existing_item = session.query(Bullet).filter(Bullet.id == bullet_id).one()
slide.bullets.insert(new_order, existing_item)
slide.bullets.reorder()
session.commit()

似乎没有任何文档可以解释如何更新现有对象。我想念什么吗?

1 个答案:

答案 0 :(得分:0)

我想我明白了。重新插入之前,我需要在有问题的对象上调用remove()

不确定是否有更好的方法,但这行得通。

existing_item = session.query(Bullet).filter(Bullet.id == bullet_id).one()
slide.bullets.remove(existing_item)
slide.bullets.insert(new_order, existing_item)
slide.bullets.reorder()
session.commit()

还值得注意的是:我正在使用count_from=1,因此要求我从new_order中减去1,以便最终用户不会被以0开始的订单所困扰。