【问题标题】:Django ManyToManyField as multisetDjango ManyToManyField 作为多重集
【发布时间】:2016-11-09 13:40:02
【问题描述】:

有什么办法可以在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 就像一个集合一样工作,有什么方法可以实现多集合的行为吗?

【问题讨论】:

标签: python django django-models many-to-many multiset


【解决方案1】:

您可以存储InventoryItem,而不是将Item 存储在您的库存中

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

这个想法是你引入一个中间类来为你处理数量,以及潜在的其他事情,比如项目是否可以堆叠。

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

【讨论】:

  • 哦,我以为我必须做一些中产阶级,但我希望我错了。谢谢。
  • @Zoli - 就像我说的,你可以通过复制项目对象来避免它,或者可能使用其他一些黑魔法,比如使用ArrayField。但它们对我来说似乎都不是很好的选择。我想在某些时候你会希望一些物品也可以堆叠(即硬币或类似物品),假设你正在制作某种游戏
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2012-03-15
  • 2014-06-12
  • 2014-11-07
  • 2014-12-18
  • 2023-03-29
相关资源
最近更新 更多