Python + SQLAlchemy: как обновить отношение «многие к одному» после изменения одного из полей объекта отношения? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть три модели Declarative_base.

class Region(BaseModel):

    id                      = BaseModel.column(type='integer', primary_key=True)
    # ...
    y1                      = BaseModel.column(type='float')
    y2                      = BaseModel.column(type='float')
    x1                      = BaseModel.column(type='float')
    x2                      = BaseModel.column(type='float')
    map_id                  = BaseModel.column(type='mediumint')

    units = relationship('Unit', primaryjoin="and_((Region.id == Unit.region_id), (Unit.unit_template_id))")

    players = relationship('Player', lazy='subquery')


class Unit(BaseModel):

    # ...
    region_id               = Object.column(type='integer',
                                        foreign_key=db_name + '.region.id',
                                        nullable=True)

    region                  = relationship('Region', lazy='subquery')

class Player(Unit):

    # ...
    unit                    = relationship('Unit', lazy='subquery')

Как видите, Player наследует Unit.Region содержит список юнитов и список игроков.Когда я меняю любое поле игрока, унаследованное от юнита, отношение региона players не обновляется.Что мне следует сделать после изменения поля Player, чтобы обновить отношение Region players к получению фактических данных?

PS Если это возможно, я хочу избежать дополнительного сохранения в БД, потому что сначала мне нужно выполнить некоторые действия(например, вычисления и т. д.).

1 Ответ

1 голос
/ 21 июня 2019

Отношение players региона полностью основано на объектах, запрашиваемых из базы данных, поэтому оно не будет "обновляться", пока база данных не будет обновлена.

db.session.commit()
# now region.players is up to date

Если вы действительно обеспокоены производительностью, вы можете использовать в памяти Player объектов для выполнения любых действий перед сохранением в базе данных.

players_list = region.players
players_list[0].field = "new value"
# now players_list is up to date while region.players is not
do_calculations(players_list)
# save to db after all calculations are done
db.session.commit()
...