我有一个项目的模型,他们尊重所有者,每个项目可以有多个所有者,每个所有者可以有多个项目。如下所示:
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') #
但我仍然不确定我是否正确。因此,如果您对我可能遇到的错误/陷阱有任何意见/建议,请告诉我。我真的很感激。
非常感谢!
答案 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)
您仍然可以访问项目的owners
和prices
(后者通过查看相关的ItemSale
个对象。)