Django模型结构
Posted
技术标签:
【中文标题】Django模型结构【英文标题】:Django model structure 【发布时间】:2012-01-07 06:19:13 【问题描述】:我正在创建一个简单的游戏数据库,但遇到了一些问题。
有 2 种模型:Material 和 Building。
class Material(Model):
type = CharField(max_length=30)
class Building(Model):
cost = M2M(?)
input = M2M(?)
output = M2M(?)
在材质模型中,保存材质名称(木头、石头、铁、木板、鱼、食物等)。 建筑应该有更多的领域,但是,我遇到的困难只有这些。想象一下像“定居者”游戏这样的东西。该建筑需要 3 块石头来建造(成本),需要 2 块木头(输入)来生产 1 块木板(输出)。
如何制作这样的结构,我可以指定材料的数量并在必要时轻松修改它。
我已经尝试使用 through 参数,但是,它并没有让我在模型中出现 3 次或更多次。
【问题讨论】:
【参考方案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)
【讨论】:
是的,它可以,但似乎我不能在一个模型中添加多个通过同一个表相关的字段... db.building:模型Building有两个通过模型ResourceQuantity手动定义的m2m关系,这是不允许的。请考虑在中间模型上使用额外的字段。 对了,之后如何创建Building的实例?以上是关于Django模型结构的主要内容,如果未能解决你的问题,请参考以下文章
Django models文件模型变更注意事项(表结构的修改)
卡在 Django 中的 App DB 模型结构中。 (工作安全清单应用程序)