しばらく検索しましたが、これに関する既存の質問が見つからないようです(ただし、用語がわからないという問題である可能性があります)。
私はDjangoを初めて使用し、時間の経過とともに非常に拡張可能なデザインを採用して、DjangoのORMで機能するようにしようとしています。基本的に、これは共有ジャンクションテーブルを使用した一連の多対多の関係です。
デザインは、「[必要]を満たせば、[コスト]を素材として[報酬]を作成できる」という一般的なゲームクラフトシステムです。これにより、同じシステムを使用して任意の数のショップからアイテムを販売でき、幅広いメカニズムをサポートするのに十分な汎用性があります。これまでに使用に成功したことがあります。
Djangoは、同じジャンクションテーブルを共有する複数のM2M関係をサポートしていないため(明らかに、逆の関係を解決する方法がないため)、次のオプションがあるようです。
- 独自のジャンクションテーブルを作成して、最終的に6つ以上にするか、
- 組み込みのMTM関係の代わりに、ジャンクションテーブルへの外部キーを使用します。
最初のオプションは少し混乱しています。最終的にはジャンクションテーブルにフィールドを追加する必要があることがわかっているからです。2番目のオプションはかなりうまく機能します。残念ながら、junctionテーブル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情報のインライン編集を許可しようとしています。