【问题标题】:Django model structureDjango模型结构
【发布时间】: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 次或更多次。

【问题讨论】:

    标签: django model many-to-many


    【解决方案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的实例?
    猜你喜欢
    • 2023-04-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2012-02-24
    相关资源
    最近更新 更多