Django ManyToManyField 作为多重集

Django ManyToManyField as multiset

有什么方法可以多次在 m2m 字段中存储同一个对象?

假设我有以下型号

class Item(models.Model):
    name = models.CharField(max_length=64)


class Inventory(models.Model):
    items = models.ManyToManyField('Items', blank=True)

然后我创建了一些实例

>>> inventory = Inventory()
>>> inventory.save()

>>> item1 = Item(name='Item 1')
>>> item1.save()

>>> item2 = Item(name='Item 2')
>>> item2.save()

现在我想多次将这些项目实例添加到库存中。

>>> inventory.items.add(item1)
>>> inventory.items.add(item2)

>>> inventory.items.all()
[<Item: Item 1>, <Item: Item 2>]

>>> inventory.items.add(item1)

>>> inventory.items.all()
[<Item: Item 1>, <Item: Item 2>]

那么ManyToManyField就像集合一样工作,有什么办法可以实现multiset的行为吗?

您可以将 InventoryItem 存储

,而不是将 Item 存储在您的库存中
class InventoryItem(models.Model):
    item = models.ForeignKey(Items)
    quantity = models.SmallIntegerField(default=1)
    inventory = models.ForeignKey(Inventory)

我们的想法是引入一个中间层 class 来为您处理数量,以及其他可能的事情,比如物品是否可以堆叠。

我能想到的唯一替代方法是复制一个项目对象,然后将它们都存储在库存中——这对您的用例来说可能更好,也可能不好