0

我有一个Item模型及其尊敬的Owner,每个项目可以有多个所有者,每个所有者可以有多个项目。如下所示:

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')

现在,我想将其转换为多供应商方案。每个项目可以由多个所有者拥有,每个所有者可以为自己的项目设置自己的价格。所以我认为我需要做的是将价格添加到项目模型并创建一个新类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)

您仍然可以访问项目的ownersprices(后者通过查看相关ItemSale对象)。

于 2012-08-17T21:38:03.567 回答