Django:模型上的ManyToMany字段

时间:2018-08-28 06:55:04

标签: python django python-3.x django-models django-forms

我有以下模型:

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应该返回一个单位。

还有其他实现方法吗?新的数据库设计??那怎么办帮助。

注意:我无法框出此帖子的标题。随意这样做。谢谢。

3 个答案:

答案 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。