我已经搜索了一段时间,但似乎无法找到一个现有的问题(尽管这可能是不知道术语的问题)。
我是 Django 的新手,并且一直在尝试采用随着时间的推移应该非常可扩展的设计,并使其与 Django 的 ORM 一起使用。本质上,它是一系列使用共享连接表的多对多关系。
该设计是一个通用的游戏制作系统,上面写着“如果你满足[要求],你可以使用[成本]作为材料来创造[奖励]。” 这允许使用相同系统从任意数量的商店出售物品,并且通用性足以支持广泛的机制 - 我在过去看到它成功使用过。
Django 不支持共享同一个联结表的多个 M2M 关系(显然是因为它无法计算出反向关系),所以我似乎有以下选项:
- 让它创建自己的联结表,最终有六个或更多,或者
- 使用联结表的外键代替内置的 MTM 关系。
第一个选项有点混乱,因为我知道我最终必须在联结表中添加额外的字段。第二个选项效果很好。不幸的是,因为没有从联结表 BACK 到其他每个表的外键,我一直在与管理系统作斗争,以让它做我想做的事。
以下是受影响的型号:
class Craft(models.Model):
name = models.CharField(max_length=30)
description = models.CharField(max_length=300, blank=True)
cost = models.ForeignKey('Container', related_name="craft_cost")
reward = models.ForeignKey('Container', related_name="craft_reward")
require = models.ForeignKey('Container', related_name="craft_require")
class ShopContent(models.Model):
shopId = models.ForeignKey(Shop)
cost = models.ForeignKey('Container', related_name="shop_cost")
reward = models.ForeignKey('Container', related_name="shop_reward")
require = models.ForeignKey('Container', related_name="shop_require")
description = models.CharField(max_length=300)
class Container(models.Model):
name = models.CharField(max_length=30)
class ContainerContent(models.Model):
containerId = models.ForeignKey(Container, verbose_name="Container")
itemId = models.ForeignKey(Item, verbose_name="Item")
itemMin = models.PositiveSmallIntegerField(verbose_name=u"min amount")
itemMax = models.PositiveSmallIntegerField(verbose_name=u"max amount")
weight = models.PositiveSmallIntegerField(null=True, blank=True)
optionGroup = models.PositiveSmallIntegerField(null=True, blank=True,
verbose_name=u"option group")
有没有一种更简单、可能很明显的方法来让它发挥作用?我正在尝试允许对 Craft 编辑界面上每个相关列的 ContainerContent 信息进行内联编辑。