如果项目是非唯一的,您可以使用PlayerItem模型并将其定义为丹尼尔罗斯曼建议的through model。为了避免保存同一项目两次,则可以使用unique_together
:
class Item(models.Model):
name = models.CharField(max_length = 200, blank = False)
class Player(models.Model):
items = models.ManyToManyField(Item, through='PlayerItem')
class PlayerItem(models.Model):
player = models.ForeignKey(Player)
item = models.ForeignKey(Item)
quantity = models.IntegerField(default=1)
class Meta:
unique_together = ('player', 'item')
但是,如果项目将略有不同,或者您需要存储收购日期,例如,你需要进行不同的设置:
class Item(models.Model):
name = models.CharField(max_length = 200, blank = False)
class Player(models.Model):
items = models.ManyToManyField(Item, through='PlayerItem')
class PlayerItem(models.Model):
player = models.ForeignKey(Player)
item = models.ForeignKey(Item)
acquired = models.DateTimeField(default=datetime.datetime.now)
这你会保存(玩家,物品)元组的副本,每个物品一个。然后您可以通过count()
获取特定物品的编号。
我还想指出,您无法从Item
和Player
都达到PlayerItem
模型。在这两种情况下,您都需要直接查询PlayerItem
以访问额外的字段。 (如记录)