2010-01-21 96 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以訪問額外的字段。 (如記錄)