Python + SQLAlchemy:关系的对象字段之一更改后,如何更新多对一关系?

时间:2019-06-20 22:12:31

标签: python sqlalchemy python-3.5 many-to-one

我有三个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继承了UnitRegion包含单位列表和玩家列表。当我更改任何从单位继承的玩家字段时,该区域的players关系不会刷新。更改Player字段以刷新区域players与实际数据之间的关系后应该怎么办?

P.S。如果可能的话,我想避免额外保存到数据库,因为我需要先执行一些操作(例如计算等)。

1 个答案:

答案 0 :(得分:1)

该区域的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()