设计Django的模型使用ManyToManyField进行多供应商计划?

时间:2012-08-17 21:20:50

标签: django django-models many-to-many

我有一个项目的模型,他们尊重所有者,每个项目可以有多个所有者,每个所有者可以有多个项目。如下所示:

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'

我还有一个价格 PremiumPrice 等级来设置商品的价格:

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

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

正如您所看到的,每个项目只能通过 PremiumPrice 类设置一个价格,每个项目都由该项目的所有者拥有,任何所有者都可以更改价格,但价格是唯一的项目。此外,当有人购买该商品时,它由 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'

Adn然后将类 PremiumPrice :项目从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') #

但我仍然不确定我是否正确。因此,如果您对我可能遇到的错误/陷阱有任何意见/建议,请告诉我。我真的很感激。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您的模型看起来比他们需要的要复杂一些。您在所有地方都使用through=,但除非您是adding extra fields to a many-to-many relationships,否则实际上并不需要。

假设您的要求与描述的不同,而不是编码,您可以将其归结为:

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个对象。)