我正在创建一个简单的游戏数据库,我遇到了一些问题。
有两种型号:材料和建筑。
class Material(Model):
type = CharField(max_length=30)
class Building(Model):
cost = M2M(?)
input = M2M(?)
output = M2M(?)
在材料模型中,保留材料名称(木材,石材,铁,木板,鱼,食品等)。 建筑应该有更多的领域,但是,我只遇到这些困难。想象一下像“The Settlers”这样的游戏。该建筑需要建造3块石头(成本),需要2块木材(输入)来生产1块木板(输出)。
我如何制作这样的结构,我可以指定材料的数量,并在必要时轻松修改它。
我已经尝试通过参数使用,但是,它不允许我在模型中出现3次或更多次。
答案 0 :(得分:1)
也许您的through表格可能有quantity
字段?
修改强>
啊,我明白了。由于表格的工作方式,这是一个限制。直通表仅引用它们连接在一起的两个模型,但无法知道所述模型上的哪些字段定义了m2m关系。因此每个直通表只能用于一个关系。但是,对于某些abstract subclassing,我们可以保持代码相当干净:class BuildingMaterialBase(models.Model):
material = models.ForeignKey('Material')
building = models.ForeignKey('Building')
quantity = models.IntegerField()
class Meta:
abstract = True
class BuildingMaterialIn(BuildingMaterialBase):
pass
class BuildingMaterialOut(BuildingMaterialBase):
pass
class Building(models.Model):
in_ = models.ManyToManyField(Material, through=BuildingMaterialIn)
out_ = models.ManyToManyField(Material, through=BuildingMaterialOut)