使用 through 模型创建 Django 记录实例

问题描述 投票:0回答:1

假设您有一个战斗的概念,并且在该战斗中有玩家和敌人。 玩家是简单的ManyToMany,但敌人需要Through模型,因为如果有“Goblin”的DB条目,玩家需要与Goblin模型的实例战斗。玩家可能会与许多哥布林战斗,每个哥布林在任何特定时刻都需要自己的健康/状态。

到目前为止,我已经有了一个像这样的 Django 模型(我正在简化代码以提高可读性,并专注于主要问题)

class Battle(models.Model):
    players = ManyToMany(Player)
    enemies = ManyToMany(Enemy, through=EnemyThroughModel)

通过对 admin.py 等进行适当的调整,我可以将多个敌人附加到一场战斗中,并在管理中看到它们单独列出,但是,这些都被锁定到相同的基本敌人,如果我更改其中之一他们(比如说,他们受到伤害),所有对该敌人的关键引用现在都减少了他们的生命值。

有没有一种巧妙的方法可以通过模型来创建敌人的新实例,以便他们拥有独立的生命值/法力/等等?

python django database django-models orm
1个回答
0
投票

您需要在直通模型中设置敌人的生命值/法力:

class Player(models.Model):
    pass

class EnemyType(models.Model):
    pass

class EnemyInstance(models.Model):
    enemy_type = models.ForeignKey(EnemyType, on_delete=models.CASCADE)
    battle = models.ForeignKey('myapp.Battle', on_delete=models.CASCADE)
    mana = models.IntegerField()
    health = models.IntegerField()

class Battle(models.Model):
    players = models.ManyToManyField(Player)
    enemies = models.ManyToManyField(EnemyType, through=EnemyInstance)

话虽这么说,关系数据库并不是为了以这种方式使用而设计的。 在游戏运行时,您需要实时读取玩家和敌人的生命值/法力统计数据。 最好使用 python 对象或其他数据结构(xml、json 等)将此数据存储在内存中。 请参阅如何选择如何存储数据?以获得良好的起点。

© www.soinside.com 2019 - 2024. All rights reserved.