Considérese el siguiente esqueleto de un models.py para un juego de conquista del espacio:ORM de Django: Objetos de almacenamiento en caché y la manipulación de ForeignKey
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()
Tengo muchos modelos de este tipo de datos para un proyecto que estoy trabajando, y yo cambiar el estado del juego basado en interacciones algo complicadas entre varios objetos de datos. Quiero evitar un montón de llamadas innecesarias a la base de datos, por lo que una vez por turno, que hago algo así como
- Consulta todas las flotas, los planetas y otros objetos de la base de datos y almacenar en caché como objetos pitón
- Proceso de la los objetos del juego, resolviendo el estado del juego
- guardarlos de nuevo en la base de datos
Este modelo parece romper totalmente abajo al usar objetos ForeignKey. Por ejemplo, cuando una nueva flota se aparta un planeta, tengo una línea que se ve algo como esto:
fleet.home.ships -= fleet.ships
Después de ejecutar esta línea, no tengo otro código que altera el número de barcos en cada uno de los planetas, incluyendo el planeta fleet.home. Lamentablemente, los cambios realizados en la línea anterior no se reflejan en el QuerySet de planetas que obtuve antes, de modo que cuando guardo todos los planetas al final del turno, los cambios en los barcos de fleet.home se sobrescriben.
¿Hay alguna forma mejor de manejar esta situación? ¿O es así como son todos los ORM?
Bien resumen –
Sí, muchas gracias por esta respuesta informativa.Sé que eso no significa que el ORM de Django sea malo; de hecho, he desarrollado un proyecto completo usando Django que no requiere este tipo de procesamiento de datos complicado, y este problema nunca ha surgido, y es por eso que estaba tan perdido. –