簡體   English   中英

Django:模型上的ManyToMany字段

[英]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

如您所見,我們有一個包含多個unitsItem和一個包含多個itemsInvoice

但是,我希望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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM