2016-07-07 75 views
0

有没有办法如何在m2m字段多次存储相同的对象?Django ManyToManyField as multiset

比方说,我有以下型号

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的行为?

+1

相关跨站好:建模库存系统在SQL](http://gamedev.stackexchange.com/q/116996) – Sayse

回答

1

不是存储Item的“在你的库存S,你可以存储InventoryItem

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

的想法是你介绍一个中产阶级处理量的你,以及像应该潜在的其他东西该项目是可堆叠的。

我能想到的唯一办法是复制一个项目对象,然后存储这两个在库存 - 这可能会或可能不会对你的使用情况

+0

哦,我认为我将不得不做一些中产阶级,但我希望我错了。谢谢。 – Zoli

+0

@Zoli - 正如我所说的,你可以通过复制项目对象或潜在的其他一些黑魔法来避免它,比如使用'ArrayField'。但他们都不是我的好选择。我想在某些时候你会想要一些物品也可以堆叠(即Coins或类似物),假设你正在做某种游戏 – Sayse