Порядок обновления существующего объекта с использованием SQLAlchemy OrderingList - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь обновить порядок существующего объекта при использовании списка заказов 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 голосов
/ 01 апреля 2019

Я думаю, я понял это. Мне нужно было вызвать 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, поэтому требуется, чтобы я вычел 1 из new_order, чтобы конечный пользователь не смутился из-за заказа, начинающегося с 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...