我有以下模型:
class Unit(AppModel):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Item(AppModel):
title = models.CharField(max_length=255)
units = models.ManyToManyField("Unit", symmetrical=False, related_name="items")
def __str__(self):
return self.title + self.units
class Invoice(AppModel):
items = models.ManyToManyField("Item", symmetrical=False, related_name="invoices")
def __str__(self):
return "invoice_" + self.id
如您所见,我们有一个Item
和多个units
,还有一个Invoice
和多个items
。
但是,我希望item
中的每个Invoice
仅具有一个unit
。如何实现?
,即some_item.units
应该返回其所有类型的单位。而for item in some_invoice.items: return item.units
应该返回一个单位。
还有其他实现方法吗?新的数据库设计??那怎么办帮助。
注意:我无法框出此帖子的标题。随意这样做。谢谢。
答案 0 :(得分:1)
您需要一个ForeignKey才能在Item模型上进行组合,而不是ManyToManyField。这样,一个项目将只有一个单位,但是一个单位将被允许具有多个项目。
答案 1 :(得分:0)
您可以将项目关系更改为ForeignKey
class Item(AppModel):
title = models.CharField(max_length=255)
units = models.ForeignKey(Unit, related_name="items")
更新
在单位和项目之间设置发票模型。
class Item(AppModel):
units = models.ManyToManyField(Unit, through='Invoice')
class Unit(AppModel):
...
class Invoice(AppModel):
item = models.ForeignKey(Item, related_name='invoice')
unit = models.ForeignKey(Unit, related_name='invoice')
答案 2 :(得分:0)
这就是我所需要的。
class Unit(AppModel):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Item(AppModel):
title = models.CharField(max_length=255)
units = models.ManyToManyField("Unit", symmetrical=False,
related_name="items", through='ItemUnit')
def __str__(self):
return self.title + self.units
class ItemUnit(AppModel):
item = models.ForeignKey(Item)
unit = models.ForeignKey(Unit)
def __str__(self):
return "%s --- %s " % (self.item, self.unit)
class Invoice(AppModel):
item_unit = models.ForeignKey(ItemUnit, blank=True, null=True,
related_name='invoices', on_delete=models.SET_NULL)
在上述设置中,项目单位发票始终是唯一的组合。确保为多对多FK指定on_delete。