考虑以下用于太空征服游戏的 models.py 框架:
class Fleet(models.Model):
game = models.ForeignKey(Game, related_name='planet_set')
owner = models.ForeignKey(User, related_name='planet_set', null=True, blank=True)
home = models.ForeignKey(Planet, related_name='departing_fleet_set')
dest = models.ForeignKey(Planet, related_name='arriving_fleet_set')
ships = models.IntegerField()
class Planet(models.Model):
game = models.ForeignKey(Game, related_name='planet_set')
owner = models.ForeignKey(User, related_name='planet_set', null=True, blank=True)
name = models.CharField(max_length=250)
ships = models.IntegerField()
对于我正在处理的项目,我有许多这样的数据模型,并且我根据各种数据对象之间有些复杂的交互来更改游戏的状态。我想避免对数据库进行大量不必要的调用,所以每回合一次,我会做类似的事情
- 从数据库中查询所有舰队、行星和其他对象,并将它们缓存为 python 对象
- 处理游戏对象,解析游戏状态
- 将它们保存回数据库
当使用 ForeignKey 对象时,这个模型似乎完全崩溃了。例如,当一个新舰队离开一个星球时,我有一条看起来像这样的线:
fleet.home.ships -= fleet.ships
在这条线运行之后,我有其他代码可以改变每个行星上的船只数量,包括行星fleet.home。不幸的是,上一行所做的更改并没有反映在我之前获得的行星查询集中,因此当我在回合结束时保存所有行星时,对舰队.home 的船只的更改会被覆盖。
有没有更好的方法来处理这种情况?或者这就是所有 ORM 的样子?