如果項目是非唯一的,您可以使用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
以訪問額外的字段。 (如記錄)