Рассмотрим следующий скелет файла 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. К сожалению, изменения, сделанные в приведенной выше строке, не отражены в наборе запросов, который я получил ранее, поэтому, когда я сохраняю все планеты в конце хода, изменения для судов fleet.home перезаписываются.
Есть ли лучший способ справиться с этой ситуацией? Или это как раз все ОРМ?