0

私はItemのモデルを所有しています。各アイテムは複数の所有者を持つことができ、各所有者は複数のアイテムを持つことができます。以下のように:

class User(models.Model):
    user = models.ForeignKey(DjangoUser)

class Item(models.Model):
    owners = models.ManyToManyField(User, through='**ItemOwner**')

class ItemOwner(models.Model): 
    item = models.ForeignKey(Item)
    owner = models.ForeignKey(User)

    class Meta(models.Model.Meta):
        db_table = 'items_owners'

アイテムの価格を設定するクラスPricePremiumPriceもあります。

class **Price**(models.Model):
    price = models.DecimalField(max_digits=12) 

class **PremiumPrice**(models.Model):
    item = models.OneToOneField(Item)
    price = models.ForeignKey(Price)

ご覧のとおり、各アイテムはクラスPremiumPriceによって設定された価格を 1 つだけ持つことができ、各アイテムはそのアイテムの所有者によって所有されていました。所有者は価格を変更できますが、価格はそのアイテムに固有です。また、誰かがそのアイテムを購入すると、以下のようにPurchaseItemクラスによって処理されました。

class PurchaseItem(models.Model):
    item = models.ForeignKey(Item)
    user = models.ForeignKey(User)

    class Meta:
        db_table = 'purchase_item'
        unique_together = ('item', 'user')

今、私はそれをマルチベンダー方式に変換したいと考えています。各アイテムは複数の所有者が所有でき、各所有者は自分のアイテムに独自の価格を設定できます。だから私がする必要があると思うのは、 Item モデルに価格を追加し、新しいクラスItemPriceを作成することです(各アイテムの価格を追加するため):

class Item(models.Model):
    owners = models.ManyToManyField(User, through='ItemOwner')
    prices = models.ManyToManyField(Price, through='ItemPrice')

class ItemPrice(models.Model): 
    item = models.ForeignKey(Item)
    price = models.ForeignKey(Price)
    class Meta(models.Model.Meta):
        db_table = 'items_prices'

次に、クラスPremiumPrice : item を OneToOneField からForeignKeyに変更し、所有者も含めます。

    class PremiumPrice(models.Model):
        item = models.ForeignKey(Item)
        price = models.ForeignKey(Price)
        owner = models.ForeignKey(User)

各トランザクションを記録するには、クラス PurchaseItem にも所有者を含める必要があり、unique_togetherにも新しい値が必要です。

class PurchaseItem(models.Model):
    item = models.ForeignKey(Item)
    user = models.ForeignKey(User)
    owner = models.ForeignKey(User)

    class Meta:
        db_table = 'purchase_item'
        unique_together = ('item', 'user', 'owner') #

しかし、私が正しいかどうかはまだ確信が持てません。したがって、エラー/落とし穴についてコメント/提案がある場合は、お知らせください。本当に感謝しています。

どうもありがとうございました!

4

1 に答える 1

0

モデルは必要以上に複雑に見えます。あちこちで使用していますが、多対多の関係にフィールドを追加しthrough=ない限り、実際には必要ありません。

要件がコード化されたものではなく記述されたものであると仮定すると、これは次のように要約できます。

class User(models.Model):
    user = models.ForeignKey(DjangoUser)
    owned_items = models.ManyToManyField(Item, through='ItemSale')
    purchased_items = models.ManyToManyfield(Item, related_name='purchasers')

class Item(models.Model):
    pass

class ItemSale(models.Model):
    owner = models.ForeignKey(User, related_name='owners')
    item = models.ForeignKey(Item)
    price = models.DecimalField(max_digits=12)

ownersアイテムのand に引き続きアクセスできますprices(後者は関連ItemSaleオブジェクトを参照することによって)。

于 2012-08-17T21:38:03.567 に答える