2010-01-21 97 views
1

我想模拟以下情况。我有一张物品表和一张玩家表,玩家可以有很多物品并且有多个相同物品的副本。我可以轻松的播放器型号有多个项目:Django - 如何正确建模?

class Item(models.Model): 
    name = models.CharField(max_length = 200, blank = False) 

class Player(models.Model): 
    items = models.ManyToManyField(Term) 

但我想知道的玩家,即每个项目的频率每个项目的数量。我怎样才能在Django中最好地建模。 (我simplfied我的实际型号/问题让我翻过点:))

干杯,

皮特

回答

1

如果项目是非唯一的,您可以使用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()获取特定物品的编号。

我还想指出,您无法从ItemPlayer都达到PlayerItem模型。在这两种情况下,您都需要直接查询PlayerItem以访问额外的字段。 (如记录)