Django - 如何正确建模?

时间:2010-01-21 12:57:30

标签: python django model

我想模拟以下情况。我有一个项目表和一个玩家表,一个玩家可以有很多项目,并有同一项目的多个副本。我可以轻松地为具有多个项目的玩家建模:

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

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

但我想知道玩家拥有的每件物品的数量,即每个物品的频率。我怎样才能在Django中最好地模拟这个。 (我已经简化了我的实际模型/问题以获得我的观点:))

干杯,

皮特

2 个答案:

答案 0 :(得分:5)

explicit through tablequantity字段一起使用。

答案 1 :(得分:0)

如果这些项目是非唯一的,您可以使用PlayerItem模型并将其定义为through model,如Daniel Roseman所建议的那样。为避免将同一项目保存两次,您可以使用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()获取特定项目的编号。

我还要注意,您无法从PlayerItemItem获得Player模型。在这两种情况下,您都需要直接查询PlayerItem以访问额外字段。 (记录在案)