Django模型结构

Posted

技术标签:

【中文标题】Django模型结构【英文标题】:Django model structure 【发布时间】:2012-01-07 06:19:13 【问题描述】:

我正在创建一个简单的游戏数据库,但遇到了一些问题。

有 2 种模型:MaterialBuilding

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 管理员反映模型的层次结构吗?

Django models文件模型变更注意事项(表结构的修改)

Django - 使用模型和数据序列化复杂的上下文结构

卡在 Django 中的 App DB 模型结构中。 (工作安全清单应用程序)

Python 3 Django Rest Framework - 如何向这个 M-1-M 模型结构添加自定义管理器?

Django中树形结构