1

しばらく検索しましたが、これに関する既存の質問が見つからないようです(ただし、用語がわからないという問題である可能性があります)。

私は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情報のインライン編集を許可しようとしています。

4

2 に答える 2

3

名前、説明、タイプがあり、コスト、報酬、要件を定義する一種の「トランザクション」があるようです。ShopContent複数のモデル( 、、など)ではなく、単一のモデルとして定義する必要がありますCraft

class Transaction(models.Model):
    TYPE_CHOICES = (('Craft', 0),
                    ('Purchase', 1),
                   )
    name        = models.CharField(max_length=30)
    description = models.CharField(max_length=300, blank=True)
    cost        = models.ForeignKey('Container')
    reward      = models.ForeignKey('Container')
    require     = models.ForeignKey('Container')
    type        = models.IntegerField(choices = TYPE_CHOICES)

ShopなどはにシングルManyToManyFieldを持つことができますTransaction

この特定のモデルを使用するかどうかに関係なくcost、、、rewardおよびrequire関係はすべて1つの場所にある必要があります。上記のように、またはとの関係OneToOneなどです。ご想像のとおり、複雑な多対多の関係はありません。すべて本当に同じテーブル。CraftShopContentthrough


あなたはあなたの投稿の下部にあなたがいると述べています

編集インターフェースContainerContentの関連する各列からの情報のインライン編集を許可しようとしています。Craft

いくつかのレベルの関係をモデル化していて、管理アプリを使用している場合は、ネストされたインラインパッチを適用する、最近の質問で使用したようなリンクスキームを使用する必要があります。 1つのオブジェクトのDjango管理ページから関連オブジェクトの管理ページへのリンクを追加しますか?

于 2012-04-12T19:26:31.547 に答える
1

ここでは何か複雑すぎる匂いがしますが、間違っているかもしれません。まず、これはもっと良いですか?(ContainerContent後でわかります)

class Cost(models.Model):
    name        = models.CharField(max_length=30)

class Reward(models.Model):
    name        = models.CharField(max_length=30)

class Require(models.Model):
    name        = models.CharField(max_length=30)

class Craft(models.Model):
    name        = models.CharField(max_length=30)
    description = models.CharField(max_length=300, blank=True)
    cost        = models.ForeignKey(Cost)
    reward      = models.ForeignKey(Reward)
    require     = models.ForeignKey(Require)

class Shop(models.Model):
    name        = models.CharField(max_length=30)
    crafts      = models.ManyToMany(Craft, blank=True)
于 2012-04-12T21:47:19.703 に答える