[英]Django: ManyToMany Field on a model
我有以下模型:
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
如您所見,我們有一個包含多個units
的Item
和一個包含多個items
的Invoice
。
但是,我希望Invoice
每個item
都只有一個unit
。 如何實現呢?
即some_item.units
應該返回其所有類型的單位。 而for item in some_invoice.items: return item.units
應該返回一個單位。
還有其他實現方法嗎? 新的數據庫設計?? 那怎么辦 救命..
注意 :我無法框出該帖子的標題。 隨意這樣做。 謝謝。
您需要外鍵將其放置在Item模型上,而不是ManyToManyField。 這樣,一個項目將只有一個單位,但是一個單位將被允許擁有多個項目。
您可以將項目關系更改為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')
我認為這就是您所需要的。
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.