Django ManyToManyField как мультимножество

Есть ли способ, как хранить один и тот же объект в поле 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 работает как набор, есть ли способ достичь поведения мультимножества?

1 ответ

Решение

Вместо хранения Itemв вашем инвентаре, вы можете хранить InventoryItem"s

class InventoryItem(models.Model):
    item = models.ForeignKey(Items)
    quantity = models.SmallIntegerField(default=1)
    inventory = models.ForeignKey(Inventory)

Идея состоит в том, чтобы вы представили средний класс, который обрабатывает количество для вас, а также потенциально другие вещи, например, если элемент может быть наращиваемым.

Единственная альтернатива, о которой я могу подумать, - это продублировать предметный предмет, а затем сохранить их оба в инвентаре, что может быть лучше, а может и не лучше для вашего случая

Другие вопросы по тегам